【发布时间】:2015-02-06 06:49:24
【问题描述】:
我有一个使用 SQLDependency 监控的 SELECT 查询。一切正常,但我想在对查询正在监视的数据集进行更新时暂时暂停依赖关系,我知道这会从数据库中触发更改通知。
目前我设置了一个标志来标记我正在执行更新的事实,让依赖项触发,然后我将其重置,以便我可以继续监视查询。
必须有比这更优雅的方法。
【问题讨论】:
-
你不能停止监听器并在更新后启动它吗?
我有一个使用 SQLDependency 监控的 SELECT 查询。一切正常,但我想在对查询正在监视的数据集进行更新时暂时暂停依赖关系,我知道这会从数据库中触发更改通知。
目前我设置了一个标志来标记我正在执行更新的事实,让依赖项触发,然后我将其重置,以便我可以继续监视查询。
必须有比这更优雅的方法。
【问题讨论】:
小心使用 SqlDependency 类 - 它的 problems 存在内存泄漏。但是,您可以使用 SqlDependency 类的开源实现 - SqlDependencyEx。它使用数据库触发器和本机 Service Broker 通知来接收有关表更改的事件。这是一个用法示例:
int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME))
{
sqlDependency.TableChanged += (o, e) => changesReceived++;
sqlDependency.Start();
// Make table changes.
MakeTableInsertDeleteChanges(changesCount);
// Wait a little bit to receive all changes.
Thread.Sleep(1000);
}
Assert.AreEqual(changesCount, changesReceived);
使用 SqlDependecyEx,您可以只监控 INSERT 或 DELETE,避免 UPDATE。希望这会有所帮助。
【讨论】: