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:
Sunucuya bir
SqlDependency
bağlantı başlatın.Sunucuya bağlanmak ve transact-SQL deyimi tanımlamak için ve SqlCommand nesneleri oluşturunSqlConnection.
Yeni
SqlDependency
bir nesne oluşturun veya var olan bir nesneyi kullanın ve nesneyeSqlCommand
bağlayın. Dahili olarak, bu bir SqlNotificationRequest nesne oluşturur ve gerektiğinde bunu komut nesnesine bağlar. Bu bildirim isteği, buSqlDependency
nesneyi benzersiz olarak tanımlayan bir iç tanımlayıcı içerir. Zaten etkin değilse istemci dinleyicisini de başlatır.Nesnenin
OnChange
olayına bir olay işleyicisi abone olunSqlDependency
.nesnesinin yöntemlerinden herhangi birini
Execute
kullanarak komutunu yürütürSqlCommand
. 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.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.Start
oluş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);
}