Bagikan melalui


Mendeteksi perubahan dengan SqlDependency

Objek SqlDependency dapat dikaitkan dengan SqlCommand untuk mendeteksi jika hasil kueri berbeda dari yang diambil semula. Anda juga dapat menetapkan delegasi ke peristiwa OnChange, yang akan diaktifkan saat hasilnya berubah untuk perintah terkait. Anda harus mengaitkan SqlDependency dengan perintah sebelum menjalankan perintah. Properti HasChanges dari SqlDependency juga dapat digunakan untuk menentukan apakah hasil kueri telah berubah sejak data pertama kali diambil.

Pertimbangan Keamanan

Infrastruktur dependensi bergantung pada SqlConnection yang dibuka ketika Start dipanggil untuk menerima pemberitahuan bahwa data yang mendasar telah berubah untuk perintah tertentu. Kemampuan klien untuk memulai panggilan ke SqlDependency.Start dikendalikan melalui penggunaan SqlClientPermission dan atribut keamanan akses kode. Untuk informasi selengkapnya, lihat Mengaktifkan Pemberitahuan Kueri dan Keamanan Akses Kode dan ADO.NET.

Contoh

Langkah-langkah berikut mengilustrasikan cara mendeklarasikan dependensi, menjalankan perintah, dan menerima pemberitahuan saat kumpulan hasil berubah:

  1. Memulai koneksi SqlDependency ke server.

  2. Buat objek SqlConnection dan SqlCommand untuk terhubung ke server dan tentukan pernyataan Transact-SQL.

  3. Buat objek SqlDependency baru, atau gunakan yang sudah ada, dan ikat ke objek SqlCommand. Secara internal, ini membuat objek SqlNotificationRequest dan mengikatnya ke objek perintah sesuai kebutuhan. Permintaan pemberitahuan ini berisi pengenal internal yang secara unik mengidentifikasi objek SqlDependency ini. Ini juga memulai pendengar klien jika belum aktif.

  4. Berlangganan penanganan aktivitas ke peristiwa OnChange untuk objek SqlDependency.

  5. Jalankan perintah menggunakan salah satu metode Execute dari objek SqlCommand. Karena perintah terikat ke objek pemberitahuan, server mengenali bahwa ia harus membuat pemberitahuan, dan informasi antrean akan mengarah ke antrean dependensi.

  6. Hentikan koneksi SqlDependency ke server.

Jika ada pengguna yang kemudian mengubah data yang mendasarinya, Microsoft SQL Server mendeteksi bahwa ada pemberitahuan yang tertunda untuk perubahan tersebut, dan memposting pemberitahuan yang diproses dan diteruskan ke klien melalui SqlConnection yang mendasarinya yang dibuat dengan memanggil SqlDependency.Start. Pendengar klien menerima pesan pembatalan. Pendengar klien kemudian menemukan objek SqlDependency terkait dan mengaktifkan peristiwa OnChange.

Fragmen kode berikut menunjukkan pola desain yang akan Anda gunakan untuk membuat aplikasi sampel.

Sub Initialization()
    ' Create a dependency connection.
    SqlDependency.Start(connectionString, queueName)
End Sub

Sub SomeMethod()
    ' Assume connection is an open SqlConnection.
    ' Create a new SqlCommand object.
    Using command As New SqlCommand( _
      "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", _
      connection)

        ' Create a dependency and associate it with the SqlCommand.
        Dim dependency As New SqlDependency(command)
        ' Maintain the reference in a class member.
        ' Subscribe to the SqlDependency event.
        AddHandler dependency.OnChange, AddressOf OnDependencyChange

        ' Execute the command.
        Using reader = command.ExecuteReader()
            ' Process the DataReader.
        End Using
    End Using
End Sub

' Handler method
Sub OnDependencyChange(ByVal sender As Object, _
    ByVal e As SqlNotificationEventArgs)
    ' Handle the event (for example, invalidate this cache entry).
End Sub

Sub Termination()
    ' Release the dependency
    SqlDependency.Stop(connectionString, queueName)
End Sub
void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
    // Assume connection is an open SqlConnection.

    // Create a new SqlCommand object.
    using (SqlCommand command=new SqlCommand(
        "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers",
        connection))
    {

        // Create a dependency and associate it with the SqlCommand.
        SqlDependency dependency=new SqlDependency(command);
        // Maintain the reference in a class member.

        // Subscribe to the SqlDependency event.
        dependency.OnChange+=new
           OnChangeEventHandler(OnDependencyChange);

        // Execute the command.
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // Process the DataReader.
        }
    }
}

// Handler method
void OnDependencyChange(object sender,
   SqlNotificationEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}

void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}

Lihat juga