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 OnChange tetiklenecek olaya bir temsilci de atayabilirsiniz. komutunu yürütmeden önce komutuyla ilişkilendirmeniz SqlDependency 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 SqlConnection komut için temel alınan verilerin değiştiğine ilişkin bildirimler almak için çağrıldığında Start açılan bir altyapıya dayanır. bir istemcinin çağrısı SqlDependency.Start başlatma özelliği, ve kod erişimi güvenlik özniteliklerinin kullanımıyla SqlClientPermission 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 SqlCommand nesneleri oluşturunSqlConnection.

  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. Nesnenin OnChange olayına bir olay işleyicisi abone olun SqlDependency .

  5. nesnesinin yöntemlerinden herhangi birini Execute kullanarak komutunu yürütür 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 alınan verileri değiştirirse, Microsoft SQL Server bu tür bir değişiklik için bekleyen bir bildirim olduğunu algılar ve çağrılarak SqlDependency.Startoluşturulan temel SqlConnection alınan 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.