手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mssql>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

四、为使用查询通知作准备 站.长.站

因为默认情况下SQL Server 2005处于高度安全的状态,所以你需要“打开”一些功能才能使用查询通知。首先,你要使用的每一个数据库都需要启动Service Broker功能。为此,你可以在T-SQL中使用如下命令实现: Www..com

USE mydatabase @com

ALTER DATABASE mydb SET ENABLE_BROKER 中国.站.长站

另外,你需要授予一些SQL Server权限以允许非管理员帐户能够参与使用查询通知。 @com

五、SqlDependency.Start和Stop

SqlDependency和SqlCacheDependency都要求,在任何通知请求前先调用静态方法SqlDependency.Start()。这个方法负责创建一个SqlConnection以实现在数据改变时接收通知。注意,你仅需要在一个应用程序的生命周期的开始建立这些内容。例如,在一个ASP.NET应用程序中,global.asax文件的Application_Start事件处理器就是实现这一功能的好地方。 Www__com

注意,对包含在通知中的每一个连接都应该调用Start方法。因此,如果你在应用程序中存取多个数据库,那么你需要为每一个数据库调用Start。在下列示例中,有一个针对Pubs数据库的连接串pubsConn,它在这个应用程序的web.config文件中定义。

为了切断这个连接,你可以使用SqlDependency.Stop(),这也是一个静态方法。

以下为引用的内容:Sub Application_Start(ByVal sender as Object, _ByVal e as EventArgs)System.Data.SqlClient.SqlDependency.Start _(System.Configuration.ConfigurationManager. _Connectionstrings("pubsConn").ConnectionString)End SubSub Application_End(ByVal sender as Object,ByVal e as EventArgs)System.Data.SqlClient.SqlDependency.Stop _(System.Configuration.ConfigurationManager. _Connectionstrings("pubsConn").ConnectionString)End Sub .com

如果你在调用Start和Stop的同时观察SQL Server Profiler,那么你会看到许多有趣的信息。当调用Start时,应用程序运行一个查询以确保支持Service Broker,然后创建一个存储过程备以后用于清除在Service Broker基础结构中的SqlDependency队列和服务。最后,它运行一个SQL Server 2005 WaitFor命令,该命令负责查询在Notification Service部分的入口。这就是如果你使用ADO.NET的低级SqlNotificationRequest对象的话所有你需要显式完成的事情。

在整个的.NET 2.0的设计过程中,SqlDependency底层架构从一种推模式(来自SQL Server)改变为一种拉模式(来自.NET)。这样做的原因是为了解决第一次设计时所导致的一些安全问题。微软的Sushil Chordia在MSDN上发表了一篇有关于这种改进的文章,该文详细描述了这一改进的内在机理。 中国站.长站

六、你的第一个通知 Www~~com

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

以下为引用的内容:Imports System.Data.SqlClientPublic Class NotificationTestPublic Function DepTest() As SqlDataReaderDim conn As New SqlConnection(connstring)conn.Open()Dim cmd As New SqlCommand("SELECT * FROM authors(", conn)")Dim rdr As SqlDataReaderrdr = cmd.ExecuteReader()Return rdrEnd FunctionEnd Class

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

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

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

就是这些。当执行命令时,依赖性随着它直到数据库。在它处理查询的同时,SQL Server能够看到这一依赖性并且把它发送到Service Broker以注册它。 ^com

以下为引用的内容:Imports System.Data.SqlClientPublic Class NotificationTestDim dep As SqlDependencyPublic Function DepTest() As SqlDataReaderDim 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 SqlDataReaderrdr = cmd.ExecuteReader()Return rdrEnd FunctionEnd Class

现在,你已经注册了依赖性,但是当通知返回到应用程序时你还根本没有捕获它。不过,SqlDependency类提供了两种方式来了解一个通知。一种方式是通过OnChange事件,你可以通过创建一个代理来捕获它;另一种方式是通过属性HasChanges,你可以在你的应用程序逻辑中对之进行测试。在下列代码中,我在OnDepChange事件中添加了代码以便在后面的某个时候测试通知。 中国.站长站

以下为引用的内容:

Imports System.Data.SqlClientPublic Class NotificationTestDim dep As SqlDependencyPublic Function DepTest() As SqlDataReaderDim 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 OnDepChangeDim rdr As SqlDataReaderrdr = cmd.ExecuteReader()Return rdrEnd Function'处理器方法Public Sub OnDepChange(ByVal sender As Object, _ByVal e As SqlNotificationEventArgs) Dim DepInfo As String = e.Info.ToString'做一些事情以响应通知End SubPublic ReadOnly Property HasChanges() As BooleanGetReturn dep.HasChangesEnd GetEnd PropertyEnd Class

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!