是否有类似于Sql Server表的FileSystemWatcher?

时间:2009-08-21 13:24:37

标签: .net sql-server sql-server-2005

我希望我的Windows服务(用.NET编写)来识别何时将新行添加到特定表中,但是我不想从sql-server中提取数据,而是希望使用服务器推送模型。

有人提示我如何实现这个目标吗? 我正在使用sql server 2005。

TIA

5 个答案:

答案 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);

希望这有帮助。