我希望我的Windows服务(用.NET编写)来识别何时将新行添加到特定表中,但是我不想从sql-server中提取数据,而是希望使用服务器推送模型。
有人提示我如何实现这个目标吗? 我正在使用sql server 2005。
TIA
答案 0 :(得分:12)
如果您在C#或VB.NET中使用客户端ADO.NET,那么还有ADO.NET SqlDependency机制
可以使用SqlDependency对象 按顺序与SqlCommand关联 检测查询结果何时不同 从最初检索的那些。您 也可以分配一个代表 OnChange事件,会在什么时候开火 相关的结果会发生变化 命令。你必须关联 使用之前的命令执行SqlDependency 你执行命令。该 HasChanges的财产 SqlDependency也可用于 确定查询结果是否有 自数据出现以来发生了变化 检索。
您基本上将SqlDependency
与您的SqlCommand关联,并提供一个事件处理程序,当构成该SqlDependency的结果集的值发生更改时,将调用该事件处理程序。
using(SqlCommand cmd = new SqlCommand(queryStatement, _conn))
{
cmd.Notification = null;
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange +=
new OnChangeEventHandler(OnChange);
......
}
在事件处理程序中,您可以执行您需要执行的操作。
void OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dependency = sender as SqlDependency;
(do whatever you need to do - e.g. reload the data)
}
马克
答案 1 :(得分:3)
您在Sql Server 2005中最接近的是触发器。 Sql Server 2008也有更改数据捕获。
答案 2 :(得分:1)
答案 3 :(得分:0)
您可以使用数据库中带有webservice call的触发器。但我不知道对数据库的影响有多大(如果有的话)。
答案 4 :(得分:0)
小心使用SqlDependency类来监视数据库表中的更改 - 它有problems内存泄漏。但是,您可以使用自己的DDL触发器和SQL Service Broker API实现,也可以使用其中一个开源项目,例如: SqlDependencyEx:
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);
希望这有帮助。