| | 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 | 现在,你已经注册了依靠性,但是当通知返回到应用程序时你还根本没有捕捉它。不过,SqlDependency类提供了两种方式来了解一个通知。一种方式是通过OnChange事件,你可以通过创建一个代理来捕捉它;另一种方式是通过属性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 |
现在,我们来看一下其工作原理。首先,把一个断点放到OnDepChange事件的End Sub代码行。然后,从你喜欢的网页、表单程序或控制台程序中调用DepTest函数来进行测试。在返回SqlDataReader后,在Visual Studio 2005的Server Explorer或在SQL Server Management Studio中打开Authors表并且编辑某一个字段内容。例如,一旦锁定这一改变,那么,当你把光标移动到表中的一个新行时,断点应该被激活。
七. SQLNotificationEventArgs 当你看到通知的确从数据库中传来时,你可以分析一下相应变量的值,它是一个SqlNotificationEventArgs对象。SqlDependency总是随着OnChange事件返回这个对象,而且它是很有用的。其中,SqlNotificationInfo是一个具有18种可能值的枚举类型。其中,一些值对应情况正常,而另一些显示出了问题。这些枚举中有Update,Insert和Delete—告诉你在数据中发生了什么类型的变化。还有其它一些值即使在事件发生时也不会被发送。例如,重新启动服务器将激发所有的通知;而枚举值Drop或Truncate告诉你已经对依靠的表实现了某种操作。
另外,还存在一些依靠性甚至还不能被注册的情形,例如假如你试图对一个UPDATE查询设置一个依靠性将返回Invalid。而返回值Query显示你的查询语法并不符合通知的严格规则。上面枚举表中的最后两个枚举值,还有其它几个与不能注册查询相关的枚举值在执行该命令时被立即返回。
通过查找MSDN库中的有关SqlNotificationInfo枚举文档,你可以得到这些枚举的完全列表。
| 共5页: 上一页 [1] [2] [3] 4 [5] 下一页 |
评论加载中…