Dalam dunia pengembangan perangkat lunak modern, khususnya di lingkungan .NET, pemantauan data secara real-time telah menjadi kebutuhan mendesak bagi banyak aplikasi. Pembaruan data secara otomatis ketika terjadi perubahan di database adalah salah satu tantangan utama dalam pengembangan perangkat lunak. Namun, dengan pengenalan SqlDependency dalam .NET 7, pengembang sekarang memiliki alat yang kuat untuk mengatasi tantangan ini dan menyediakan solusi pemantauan data yang efisien. Artikel ini akan membahas tentang penggunaan SqlDependency dalam aplikasi .NET 7 berbasis WinForms dan bagaimana teknologi ini dapat meningkatkan kinerja dan efisiensi aplikasi.
Apa itu SqlDependency?
SqlDependency adalah bagian dari SqlClient namespace dalam platform .NET yang memungkinkan aplikasi untuk menerima pemberitahuan secara real-time ketika terjadi perubahan data di database SQL Server. Fitur ini berfungsi sebagai mekanisme notifikasi yang kuat dan memungkinkan aplikasi untuk mengantisipasi dan merespons perubahan data secara instan tanpa perlu melakukan polling berulang ke database.
Dalam implementasinya, SqlDependency bergantung pada fitur Query Notifications yang disediakan oleh SQL Server. Ketika query SQL yang sesuai dengan kriteria yang ditentukan dalam aplikasi mengalami perubahan, SQL Server akan mengirimkan pemberitahuan ke aplikasi yang berlangganan, memungkinkan aplikasi untuk mengambil tindakan yang sesuai.
Keuntungan Menggunakan SqlDependency
Penggunaan SqlDependency dalam aplikasi .NET 7 menawarkan sejumlah keuntungan berharga:
- Efisiensi Tinggi: Dibandingkan dengan metode polling tradisional, di mana aplikasi secara berkala memeriksa perubahan di database, SqlDependency bekerja secara asinkron dan hanya memberikan pemberitahuan ketika terjadi perubahan yang relevan. Hal ini mengurangi beban pada server database dan meningkatkan efisiensi aplikasi secara keseluruhan.
- Respon Real-time: Dengan notifikasi secara instan ketika terjadi perubahan data, aplikasi dapat merespons dengan cepat dan memberikan informasi terbaru kepada pengguna. Hal ini penting dalam lingkungan bisnis di mana kecepatan dan akurasi informasi sangat dihargai.
- Skalabilitas: SqlDependency dapat dengan mudah diintegrasikan dengan arsitektur aplikasi yang kompleks dan skalabilitas tinggi. Berbagai komponen aplikasi dapat berlangganan ke berbagai perubahan data sesuai kebutuhan, memberikan fleksibilitas dan modularitas.
TUTORIAL :
internal class DataAccessLayer { private readonly SqlConnection sqlconnection; public DataAccessLayer() { sqlconnection = new SqlConnection(LoginUserDetails.Connection); } // Method to open the connection public async Task Open() { if (sqlconnection.State != ConnectionState.Open) { await sqlconnection.OpenAsync().ConfigureAwait(false); } } // Method to close the connection public void Close() { if (sqlconnection.State == ConnectionState.Open) { sqlconnection.Close(); } } private void AddSqlCommandParameters(SqlCommand sqlcmd, string stored_procedure) { sqlcmd.CommandType = CommandType.StoredProcedure; sqlcmd.CommandText = stored_procedure; sqlcmd.Connection = sqlconnection; } // Method to read data from database public async Task<DataTable> SelectDataAsync(string stored_procedure, SqlParameter[] param, OnChangeEventHandler onChangeEventHandler = null) { if (string.IsNullOrEmpty(stored_procedure)) { return null; } await using var sqlCommand = new SqlCommand(); AddSqlCommandParameters(sqlCommand, stored_procedure); if (param != null) { sqlCommand.Parameters.AddRange(param); } if (onChangeEventHandler != null) { var sqlDependency = new SqlDependency(sqlCommand); sqlDependency.OnChange += onChangeEventHandler; } using DataTable dt = new(); using SqlDataAdapter da = new(sqlCommand); await Task.Run(() => da.Fill(dt)).ConfigureAwait(false); return dt; } }
internal class CLS_Welding { public static async Task<DataTable> GetWeldingPaintProduction(OnChangeEventHandler onChangeEventHandler = null) { using var DAL = new DataAccessLayer(); return await DAL.SelectDataAsync("GetWeldingPaintProduction", null, onChangeEventHandler).ConfigureAwait(false); } }
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[GetWeldingPaintProduction] AS SELECT daiPaiPro.[id], [FK_idPartShip], proinfo.ProjectN, [Parts], [Profile], [Quantity], [Qty] - [WeldingPaintQty] AS 'Reste Qté', [Length], [Surface], ProShip.[Weight], CAST(ProShip.[Weight] * [Quantity] AS decimal(18, 2)) AS 'Poids Tot', [Designation], [Note], [CreationDate], CONCAT(daiPaiPro.[UserID], ' ', emp.LastName_Employee, ' ', emp.FirstName_Employee) AS 'Utilisateur', cust.Name AS 'Client', ShiftTime.ShiftTime, FK_ShiftTime, FK_idNextProcess, ProShip.Qty, IdDailyWeldingProduction, IdDailyPrefabrication, SupBS.Structure FROM [dbo].[DailyWeldingPaintProduction] daiPaiPro INNER JOIN ProjectShipping ProShip ON ProShip.id = [FK_idPartShip] INNER JOIN ProjectInfo proinfo ON proinfo.id = ProShip.IdProject INNER JOIN Employee emp ON ID_Employee = daiPaiPro.[UserID] INNER JOIN Customer cust ON cust.ID = proinfo.FK_Customer INNER JOIN ShiftTime ON ShiftTime.id = FK_ShiftTime LEFT JOIN StructureType SupBS ON SupBS.id = FKSupBS ORDER BY [CreationDate] DESC GO
Solusi:
if (onChangeEventHandler != null)
{
var sqlDependency = new SqlDependency(sqlCommand);
sqlDependency.OnChange += onChangeEventHandler;
}
Post a Comment