SqlDependency ile değişiklikleri algılama

Sorgu SqlDependency sonuçlarının başlangıçta alınanlardan ne zaman farklı olduğunu algılamak için bir SqlCommand nesnesi ile ilişkilendirilebilir. Ayrıca, ilişkili bir komut için sonuçlar değiştiğinde tetiklenmiş olan OnChange olayına bir temsilci de atayabilirsiniz. Komutu yürütmeden önce SqlDependency ile komutu ilişkilendirmeniz gerekir. HasChanges özelliğiSqlDependency, veriler ilk alındığından bu yana sorgu sonuçlarının değişip değişmediğini belirlemek için de kullanılabilir.

Güvenlikle İlgili Dikkat Edilmesi Gerekenler

Bağımlılık altyapısı, belirli bir komut için temel alınan verilerin değiştiğine dair bildirimleri almak amacıyla Start çağrıldığında açılan bir SqlConnection'e dayanır. SqlDependency.Start çağrısını başlatma yeteneği, SqlClientPermission ve kod erişim güvenlik özniteliklerinin kullanımıyla denetlenir. Daha fazla bilgi için bkz . Sorgu Bildirimlerini etkinleştirme ve Kod Erişimi Güvenliği ve ADO.NET.

Örnek

Aşağıdaki adımlarda bağımlılık bildirme, komut yürütme ve sonuç kümesi değiştiğinde bildirim alma adımları gösterilmektedir:

  1. Sunucuya bir SqlDependency bağlantı başlatın.

  2. Sunucuya bağlanmak ve transact-SQL deyimi tanımlamak için ve SqlConnection nesneleri oluşturunSqlCommand.

  3. Yeni SqlDependency bir nesne oluşturun veya var olan bir nesneyi kullanın ve nesneye SqlCommand bağlayın. Dahili olarak, bu bir SqlNotificationRequest nesne oluşturur ve gerektiğinde bunu komut nesnesine bağlar. Bu bildirim isteği, bu SqlDependency nesneyi benzersiz olarak tanımlayan bir iç tanımlayıcı içerir. Zaten etkin değilse, istemci dinleyicisini de başlatır.

  4. Proposed Improvements: OnChange olayına, SqlDependency nesnesine bir olay işleyici bağlayın.

  5. Execute nesnesinin yöntemlerinden herhangi birini kullanarak komutu yürütün SqlCommand. Komut bildirim nesnesine bağlı olduğundan, sunucu bir bildirim oluşturması gerektiğini algılar ve kuyruk bilgileri bağımlılıklar kuyruğuna işaret eder.

  6. Sunucu bağlantısını SqlDependency durdurun.

Herhangi bir kullanıcı daha sonra temel verileri değiştirirse, Microsoft SQL Server bu tür bir değişiklik için bekleyen bir bildirim olduğunu algılar ve SqlConnection çağırılarak oluşturulan temel SqlDependency.Start aracılığıyla işlenen ve istemciye iletilen bir bildirim gönderir. İstemci dinleyicisi geçersizleştirme iletisini alır. İstemci dinleyici daha sonra ilişkili SqlDependency nesneyi bulur ve olayı başlatır OnChange .

Aşağıdaki kod parçası, örnek uygulama oluşturmak için kullanacağınız tasarım desenini gösterir.

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);
}

Ayrıca bkz.