Cara Menggunakan SQLDependency dalam Aplikasi .NET 7 dan WinForms [2023]

 


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 :

Dalam aplikasi Winforms, saya mencoba menggunakan `SqlDependency` jadi saya membuat kelas akses data ini:

 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;  
     }  
   }  
Dan saya menggunakannya seperti ini

 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);  
     }  
   }  
`OnDependencyChange` tidak pernah tersentuh.
Saya sudah mengaktifkan broker layanan.
Ini adalah prosedur tersimpan saya:

 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  
Saya mencoba dengan menyisipkan, memperbarui, dan menghapus. Dalam database tidak ada antrian yang ditemukan.
Apa yang saya lewatkan?

Solusi:

 if (onChangeEventHandler != null)  
 {  
      var sqlDependency = new SqlDependency(sqlCommand);  
      sqlDependency.OnChange += onChangeEventHandler;  
 }  

Post a Comment

Post a Comment (0)

Previous Post Next Post