SQL查询通知的一些整理

手头不忙,整理一下SQL查询通知的资料,希望对大家有帮助。关于SqlDependency的相关代码,各位可以去MSDN上面下载,很实用,在这里就不贴了!~

 

本文以SQL Server 2005上实现为准,SQL Server 2000因为实现机制不同,请查阅相关资料。
  
  步骤一:在SQL Server 2005上执行ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency特性。
  
  这条语句最好在数据库未执行任何事务的情况下执行。
  
  步骤二:调用SqlDependency.Start(String strConnectionString)方法,在应用程序端启用依赖监听器。
  
  该方法的参数为一个数据库的连接字符串,该数据库必须已经执行过步骤一的操作。
  
  对于同一连接字符串,若已经执行过该语句,再次执行不会发生任何异常,但返回值会为False.
  
  如果是在Web程序中使用,建议可以将该语句放在Application_Start事件中执行。
  
  监听是基于数据库的,而依赖才可以基于表或者查询。
  
  步骤三:该步骤分别有两种不同的做法。该阶段必须注意步骤。
  
  方法A:建立连接对象,再创建一个SqlCommand实例,创建SqlCacheDependency实例,在这步之后再调用Command对象来获取数据(这个顺序很重要)。之后调用Cache的Insert语句建立一个依赖于一个具体查询数据集的Cache项。
  
SqlConnection conn = new SqlConnection(strConnection);
SqlCommand command = new SqlCommand(strCommandText, conn);
SqlCacheDependency dependency = new SqlCacheDependency(command);
  
// 注册方法到委托,该委托是
CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(RemovedCallback);
  
// 新增或修改一条缓存记录
Cache.Insert(strCacheKey, objAppCache, dependency, absoluteExpiration, slidingExpiration, CacheItemPriority.Default, onRemove);
  
  方法B:建立连接对象,再创建一个SqlCommand实例,最后创建SqlDependency实例。定义SqlDependency的委托OnChange,当数据发生改变时做出相应的处理(比如清除Cache)。
  
SqlConnection conn = new SqlConnection(strConnection);
SqlCommand command = new SqlCommand(strCommandText, conn);
SqlCacheDependency dependency = new SqlCacheDependency(command);
dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange);

注意:OnChange事件里面必须删除OnChange事件绑定,否则会出现奇怪的问题!

            ISynchronizeInvoke i = (ISynchronizeInvoke)this;
            // If InvokeRequired returns True, the code
            // is executing on a worker thread.
            if (i.InvokeRequired)
            {
                // Create a delegate to perform the thread switch.
                OnChangeEventHandler tempDelegate = new OnChangeEventHandler(OnDependencyChange);
                object[] args = { sender, e };
                // to the UI thread.
                i.BeginInvoke(tempDelegate, args);
                return;
            }
            // Remove the handler, since it is only good
            // for a single notification.
            SqlDependency dependency = (SqlDependency)sender;
            dependency.OnChange -= OnDependencyChange;


使用查询通知时的特别注意事项

注意事项

说明

SQL Server 的服务帐户

对于使用本地系统帐户作为服务帐户的 SQL Server 实例,应用程序不会从其接收通知。 有关更多信息,请参见 SQL Server 联机丛书中的“Setting Up Windows Service Accounts”(设置 Windows 服务帐户)。

接收通知

无法在运行 Windows 95 或 Windows 98 的计算机上接收通知。

查询通知和事务

如果在某一事务内进行了多项影响具有已注册通知请求的一组数据的修改,则仅会发送单个通知事件。

快速更新和查询通知

使用查询通知的应用程序必须考虑到立即出现通知的情况。服务器上的数据更改时,通知消息将发送到相应的服务中介程序队列。 应用程序需要注册才能接收其他通知。 因此,如果多个应用程序快速更新某个数据集,应用程序在缓存刷新后,立即可以接收通知,检索数据,然后获取另一个更新通知。 编写使用查询通知的应用程序时必须考虑到此情况。 如果应用程序使用不断更新的数据,则可能更适合使用另一种数据缓存策略。

设置选项设置

在通知请求下执行 SELECT 语句时,提交请求的连接必须设置以下选项:

  • ANSI_NULLS ON

  • ANSI_PADDING ON

  • ANSI_WARNINGS ON

  • CONCAT_NULL_YIELDS_NULL ON

  • QUOTED_IDENTIFIER ON

  • NUMERIC_ROUNDABORT OFF

  • ARITHABORT ON

您可以为 SELECT 和 EXECUTE 语句设置通知。 使用 EXECUTE 语句时,SQL Server 会为执行的命令而不是 EXECUTE 语句本身注册通知。 该命令必须满足 SELECT 语句的要求和限制。 当注册通知的命令包含多个语句时,数据库引擎会为批处理中的每个语句创建一个通知。

对满足以下要求的 SELECT 语句支持查询通知:

  • SELECT 语句中的提取的列必须显式声明,且表名称必须用由两部分组成的名称进行限定。 请注意,这意味着语句中引用的所有表都必须位于同一个数据库中。

  • 语句不能使用星号 (*) 或 table_name.* 语法来指定列。

  • 语句不能使用未命名的列或重复的列名称。

  • 语句必须引用一个基表。

  • SELECT 语句中的提取的列不能包含聚合表达式,除非该语句使用 GROUP BY 表达式。 在提供 GROUP BY 表达式的情况下,选择列表可以包含聚合函数 COUNT_BIG() 或 SUM()。 不过,不能为可以为 null 的列指定 SUM()。 语句不能指定 HAVING、CUBE 或 ROLLUP。

  • SELECT 语句中的提取的列用作简单表达式时不能出现多次。

  • 语句不能包含 PIVOT 或 UNPIVOT 运算符。

  • 语句不能包含 INTERSECT 或 EXCEPT 运算符。

  • 语句不能引用视图。

  • 语句不能包含以下任一项: DISTINCT、COMPUTE、COMPUTE BY 或 INTO。

  • 语句不能引用服务器全局变量 (@@variable_name)。

  • 语句不能引用派生表、临时表或表变量。

  • 语句不能引用其他数据库或服务器中的表或视图。

  • 语句不能包含子查询、外部联接或自联接。

  • 语句不能引用大型对象类型: text、ntext 和 image。

  • 语句不能使用 CONTAINS 或 FREETEXT 全文谓词。

  • 语句不能使用行集合函数,包括 OPENQUERY 和 OPENROWSET。

  • 语句不能使用以下任一集合函数: AVG、COUNT(*)、MAX、MIN、STDEV、STDEVP、VAR 或 VARP。

  • 语句不能使用任何不确定性函数,包括排名和开窗函数。

  • 语句不能包含用户定义的聚合。

  • 语句不能引用系统表或视图,包括目录视图和动态管理视图。

  • 语句不能包含 FOR BROWSE 信息。

  • 语句不能引用队列。

  • 语句不能包含无法更改或无法返回结果的条件语句(例如 WHERE 1=0)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值