正常停止SqlDependency

时间:2014-01-29 19:40:48

标签: c# winforms sql-server-2008 service-broker sqldependency

我有一个应用程序,它利用SqlDependency对象来跟踪底层数据库中某些数据表的更改。

在大多数情况下,它们运行良好,但是,我注意到当我尝试使用类的静态Stop()方法来终止依赖项时,我得到以下异常:

  

当前命令发生严重错误。结果(如果有的话)应该被丢弃。操作被用户取消。

这是关于运行时提供的所有信息。在数据库末端,日志中充斥着重复的错误类型:

  

会话句柄上的查询通知对话框   '{59CC17D7-DB61-E311-BF57-00151796FDC4}'。由于以下原因而关闭   错误:8490无法找到远程服务   'SqlQueryNotificationService-058a0d35-359a-478E-b227-427d7dabc62c'   因为它不存在。

据推测,这是应用程序无法正确终止依赖关系的结果,并使通知服务保留了僵尸条目。它似乎没有造成任何不利影响,但对于没有正确终止的每个客户端,日志都会被这些通知错误所淹没......更不用说它只是不好的做法。

为什么会这样?我认为通过调用Stop(),将释放所有现有的更改事件的句柄。如果不是这样,你会如何优雅地释放所有打开的手柄?我无法显式释放它们,因为对数据的查询是由应用程序动态驱动的;我不知道在任何时候用户决定拉什么。只有他们查询的内容才受到依赖关系的约束。

1 个答案:

答案 0 :(得分:3)

不,没有办法正确关闭SqlDependency。为订阅query notifications的每个应用程序实例使用即时部署的队列和服务的设计选择使其易于使用,但会产生一些负面影响,您可以在以后看到它们这些错误消息会在您的错误日志中弹出。大多数情况下,可以安全地忽略这些错误消息,但它们may have some negative consequences

对于勇敢的人来说,可以控制自己的命运并使用更基本的SqlNotification,请参阅Using SqlNotificationRequest to Subscribe to Query Notifications。此类不会尝试代表您部署服务和队列,它希望您执行“脏工作”。好处是您可以控制并且可以避免困扰SqlDependency Start() / Stop()的问题(启动权限,不合适的关闭订单等)。