代码之家  ›  专栏  ›  技术社区  ›  marc.d

是否有类似于用于SQL Server表的FileSystemWatcher的功能?

  •  4
  • marc.d  · 技术社区  · 16 年前

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

    有人给我提示如何实现这一点吗? 我正在使用SQL Server 2005。

    蒂亚

    5 回复  |  直到 11 年前
        1
  •  12
  •   marc_s MisterSmith    16 年前

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

    sqlDependency对象可以是 按顺序与sqlcommand关联 检测查询结果何时不同 从最初的检索。你 也可以将委托分配给 OnChange事件,当 关联的 命令。您必须将 与之前命令的sqlpendency 执行命令。这个 的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)
    
    }
    

    马克

        2
  •  3
  •   Joel Coehoorn    16 年前

    最接近SQL Server2005的是一个触发器。SQL Server 2008还具有变更数据捕获功能。

        4
  •  0
  •   Matthew Whited    16 年前

    你可以用一个触发器 webservice call 从数据库中。但我不知道(如果有的话)对数据库的影响有多大。

        5
  •  0
  •   Community Mohan Dere    9 年前

    小心使用 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);
    

    希望这有帮助。

    推荐文章