剖析SQL Server 2005查询通知之基础篇(3)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


  六. 你的第一个通知

  下面,让我们开始使用SqlDependency来分析一下所有上面这些是如何协同工作的。
首先,我们创建一个类NotificationTest来存取你的数据。在这个类中,还要创建一个典型的函数以便从Pubs数据库的Authors表中查询一些数据并返回一个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


  现在,让我们修改代码来加入这种依赖性。首先,声明一个名为SqlDependency的对象。为了使之用于该类中的其它函数中,我把它定义为一个类变量。



  然后,你需要改变这个查询。查询通知要求你显式地列举在你的查询中的列,以及总是使用一种“两部分”的表名。注意一下在修改后的代码示例中的新的查询文本。



  然后,实例化新的SqlDependency并且把它依附到命令中。



  就是这些。当执行命令时,依赖性随着它直到数据库。在它处理查询的同时,SQL Server能够看到这一依赖性并且把它发送到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


  现在,你已经注册了依赖性,但是当通知返回到应用程序时你还根本没有捕获它。不过,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枚举文档,你可以得到这些枚举的完全列表。



  当我一些场合上谈论查询通知时,人们总是问我:“通知是否会告诉你发生了什么事情?”。回答是“不会”。



  总之,SQLNotificationEventArgs能够向你给出一个通知中最为详细的信息,而这些信息在调试排错时是非常有用的。





阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: SQL SERVER