首页 > 数据库 >剖析SQL Server 2005查询通知之基础篇(3)

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

时间:2023-04-10 15:07:34浏览次数:41  
标签:Dim cmd End rdr SqlDependency SQL Server 2005 conn


  六. 你的第一个通知

  下面,让我们开始使用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能够向你给出一个通知中最为详细的信息,而这些信息在调试排错时是非常有用的。





标签:Dim,cmd,End,rdr,SqlDependency,SQL,Server,2005,conn
From: https://blog.51cto.com/u_130277/6180898

相关文章

  • pymysqlpool踩坑和应用
    上周部署一个web服务时用到了多线程操作mysql数据库,虽然数据可以操作入库成功,但是一直报错‘pymysql.err.InterfaceError:(0,'')’。查了下资料是因为多线程操作引起的报错,需要使用连接池管理数据库连接。chatGPT也给出了以下回答:你可以使用连接池库(如pymysqlpool、DBUtils等......
  • 52、Pod-弹性伸缩-HPA-HorizontalPodAutoscaler、metrics-server
    Kubernetes学习目录1、安装metrics-server1.1、项目地址https://github.com/kubernetes-sigs/metrics-server当前版本:v0.6.3主要用于获取资源的参数,不然HPA无法使用1.2、下载yaml资源配置清单wgethttps://github.com/kubernetes-sigs/metrics-server/releases/downlo......
  • mysql数据库锁优化和注意 -- [转一篇很好的文章]
    为了保证数据的一致完整性,任何一个数据库都存在锁定机制。锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一。本章将对MySQL中两种使用最为频繁的存储引擎MyISAM和Innodb各自的锁定机制进行较为详细的分析。......
  • 【MySQL】数据库基础
    1.什么是数据库数据库是用来存储数据的。那么我们之前学习过的存储数据可以使用文件,那么为什么还要弄个数据库呢?这就要谈谈用文件保存数据的几个缺点:文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便因此为了解决上述的问题,专家们设计出更利......
  • 保护和升级PostgreSQL
    PostgresqlPostgreSQL是一种流行的开源关系型数据库管理系统,被许多组织用于存储和管理他们的数据。然而,数据库系统中的数据很容易受到攻击和泄露,因此必须采取安全措施和定期进行升级。本文介绍了保护和升级PostgreSQL的一些方法。一、开启审计PostgreSQL支持审计功能,可以记录......
  • 【MySQL--02】库的操作
    1.库的操作1.1创建数据库语法:CREATEDATABASE[IFNOTEXISTS]db_name[create_specification[,create_specification]...]create_specification:[DEFAULT]CHARACTERSETcharset_name[DEFAULT]COLLATEcollation_name说明:大写的表示关键字[]是可选项CHARACTERSET:指定......
  • 在Linux中配置MySQL并远程连接
    一.安装前的检查和准备工作。1.1检查自己的liunx是否安装过mysqlrpm-qa|grepmysql​1.1.1如果有的话,就删除(XXXX是自己的mysql目录)rpm-e--nodepsmysql-xxxx1.2查询所有的mysql对应的文件夹whereismysqlmfind/-namemysql​1.2.1删除相关目录或者文......
  • Loki采集Mysql errorlog,你值得拥有的错误日志聚合系统
    说到分布式日志存储系统,大家肯定对ELK、EFK这些工具并不陌生。可是它们都基于Elasticsearch存储,搭建复杂,耗资源,上手难。所以,个人非常推崇Grafana Labs开源的Loki 轻量级日志聚合分析系统Loki使用标签来作为索引,而不是对全文进行检索,所以在搜索上会有一定的局限性。但是,也能满......
  • mysql 5.1 chm 优化摘选
    1如果正使用非事务表,不应该使用MySQL来检查列的内容。一般情况,最安全的(通常是最快的)方法是让应用程序确保只向数据库传递合法值;如id=(int)$id2可移植性:如果想要使用Informix或DB2,不应该使用超过18个字符的列名3MySQL在检索和更新MyISAM表记录方面很快,但是在同一个表上混合......
  • 今天帮一朋友导入mysql数据遇到一怪问题,可是到现在都想不明白怎么回事
    xx.sql文件理应是从其它mysql管理系统中导出的,但是让我想不明白的是,为什么field字段之间却使用了圆点(.)来分隔却不是逗号(,);而从这个sql文件中却没有任何的生成此文件的系统注释说明,也让我无从知道这个数据到底从那个平台导出的,导致我测试了n次导入都以为是中文乱码问题,因为......