在整個的.NET 2.0的設計過程中,SqlDependency底層架構從一種推模式(來自SQL Server)改變?yōu)橐环N拉模式(來自.NET)。這樣做的原因是為了解決第一次設計時所導致的一些安全問題。微軟的Sushil Chordia在MSDN上發(fā)表了一篇有關于這種改進的文章,該文詳細描述了這一改進的內在機理。
六. 你的第一個通知
下面,讓我們開始使用SqlDependency來分析一下所有上面這些是如何協(xié)同工作的。
首先,我們創(chuàng)建一個類NotificationTest來存取你的數(shù)據(jù)。在這個類中,還要創(chuàng)建一個典型的函數(shù)以便從Pubs數(shù)據(jù)庫的Authors表中查詢一些數(shù)據(jù)并返回一個SqlDataReader。
Imports System.Data.SqlClient
Public Class NotificationTest
Public Function DepTest() As SqlDataReader
Dim conn As New SqlConnection(connstring)
conn.Open()
Dim cmd As New SqlCommand(
"SELECT * FROM authors(", conn)")
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader()
Return rdr
End Function
End Class
現(xiàn)在,讓我們修改代碼來加入這種依賴性。首先,聲明一個名為SqlDependency的對象。為了使之用于該類中的其它函數(shù)中,我把它定義為一個類變量。
然后,你需要改變這個查詢。查詢通知要求你顯式地列舉在你的查詢中的列,以及總是使用一種“兩部分”的表名。注意一下在修改后的代碼示例中的新的查詢文本。
然后,實例化新的SqlDependency并且把它依附到命令中。
就是這些。當執(zhí)行命令時,依賴性隨著它直到數(shù)據(jù)庫。在它處理查詢的同時,SQL Server能夠看到這一依賴性并且把它發(fā)送到Service Broker以注冊它。
Imports System.Data.SqlClient
Public Class NotificationTest
Dim dep As SqlDependency
Public Function DepTest() As SqlDataReader
Dim conn As New SqlConnection(connstring)
conn.Open()
Dim cmd As New SqlCommand( _
"SELECT au_id, au_lname,au_fname " & _
"FROM dbo.authors", conn)
dep = New SqlDependency(cmd)
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader()
Return rdr
End Function
End Class
現(xiàn)在,你已經注冊了依賴性,但是當通知返回到應用程序時你還根本沒有捕獲它。不過,SqlDependency類提供了兩種方式來了解一個通知。一種方式是通過OnChange事件,你可以通過創(chuàng)建一個代理來捕獲它;另一種方式是通過屬性HasChanges,你可以在你的應用程序邏輯中對之進行測試。在下列代碼中,我在OnDepChange事件中添加了代碼以便在后面的某個時候測試通知。
Imports System.Data.SqlClient
Public Class NotificationTest
Dim dep As SqlDependency
Public Function DepTest() As SqlDataReader
Dim conn As New SqlConnection(connstring)
conn.Open()
Dim cmd As New SqlCommand( _
"SELECT au_id,au_lname,au_fname FROM " + _
"dbo.authors", conn)
dep = New SqlDependency(cmd)
AddHandler dep.OnChange, AddressOf OnDepChange
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader()
Return rdr
End Function
'處理器方法
Public Sub OnDepChange(ByVal sender As Object, _
ByVal e As SqlNotificationEventArgs)
Dim DepInfo As String = e.Info.ToString
'做一些事情以響應通知
End Sub
Public ReadOnly Property HasChanges() As Boolean
Get
Return dep.HasChanges
End Get
End Property
End Class
現(xiàn)在,我們來看一下其工作原理。首先,把一個斷點放到OnDepChange事件的End Sub代碼行。然后,從你喜歡的網頁、表單程序或控制臺程序中調用DepTest函數(shù)來進行測試。在返回SqlDataReader后,在Visual Studio 2005的Server Explorer或在SQL Server Management Studio中打開Authors表并且編輯某一個字段內容。例如,一旦鎖定這一改變,那么,當你把光標移動到表中的一個新行時,斷點應該被激活。