.net 是否有类似于Sql Server表的FileSystemWatcher的功能?

.net 是否有类似于Sql Server表的FileSystemWatcher的功能?,.net,sql-server,sql-server-2005,.net,Sql Server,Sql Server 2005,我希望我的windows服务(用.NET编写)能够识别何时将新行添加到特定表中,但我希望使用服务器推送模型,而不是从sql server中提取数据 有没有人给我一个如何实现这一目标的提示? 我正在使用SQLServer2005 tia在Sql Server 2005中最接近的是触发器。Sql Server 2008还具有更改数据捕获功能。是的,有 如果您将客户端ADO.NET与C#或VB.NET一起使用,则还有ADO.NET机制 SqlDependency对象可以是 按顺序与SqlCommand

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

有没有人给我一个如何实现这一目标的提示? 我正在使用SQLServer2005


tia

在Sql Server 2005中最接近的是触发器。Sql Server 2008还具有更改数据捕获功能。

是的,有

如果您将客户端ADO.NET与C#或VB.NET一起使用,则还有ADO.NET机制

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)

}

Marc

您可以使用数据库中带有。但我不知道对数据库的影响有多大(如果有)。

使用类来监视数据库表中的更改时要小心,因为它会导致内存泄漏。但是,您可以使用自己的DDL触发器实现,或者使用一个开源项目,例如:


希望这能有所帮助。

鉴于2008版的通知服务又被迅速取消,我不会推荐基于此的新解决方案。正如marc_所说,SqlDependency/SqlNotificationRequest类可以从托管代码中使用。我不知道它被删除了。几年来我并没有碰过它。但是,OP明确表示他正在使用SQLServer2005,因此这不会是一个问题。也就是说,你认为马克的想法是更好的想法是对的。不与外部服务分担责任似乎更好。这是一个很好的解决方案,在您的情况下可能是最好的,但是,我非常确定“服务器”(SQL Server)并没有“推动”任何事情。。。不过,我很好奇,封面下到底发生了什么事?@迈克:服务器在推。请看这里:@Marc:实际上,ODBC和OleDB客户端也可以使用查询通知:@Remus:关于Sql依赖性的精彩文章!我以后可以引用这句话吗?:-)
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);