如何保持sql依赖性的目的

我有一个控制台应用程序。

我想继续关注数据库表中特定列的更改。

我通过互联网阅读,我发现sql依赖有利于我的目的。 我开始学习它,我做了以下事情:

  1. 创建一个类。
  2. 在构造函数中,我调用了静态函数start并调用了一个具有所有sql依赖项设置的函数。

我的问题

当我使用start点击visual studio 2013运行应用程序时,应用程序工作然后停止。 但是 ,我需要的是应用程序开始工作并继续关注数据库表中的更改。

请问你能帮帮我吗?

码:

这是一个非常简单的c#代码。

 public class MyListener { public MyListener() { SqlDependency.Start(getConnectionString()); this.listen(); } private string getConnectionString() { return ConfigurationManager.ConnectionStrings["popup"].ConnectionString.ToString(); } private void listen() { string query = "SELECT CallerID FROM TransferToSIP WHERE hasBeenRead = 0"; SqlConnection con = new SqlConnection(getConnectionString()); SqlCommand cmd = new SqlCommand(query, con); con.Open(); using (cmd) { SqlDependency dependency = new SqlDependency(cmd); dependency.OnChange += new OnChangeEventHandler(OnDependencyChange); using (SqlDataReader reader = cmd.ExecuteReader()) { } } } void OnDependencyChange(object sender, SqlNotificationEventArgs e) { Console.WriteLine("Roma"); } void Termination() { SqlDependency.Stop(getConnectionString()); Console.Read(); } 

问题在于没有再次中断。 你应该在OnDependencyChange调用listen方法。 我知道这很奇怪,但它是SqlDependency类。

小心使用SqlDependency类来监视数据库表中的更改 – 它存在内存泄漏问题 。 但是,您可以使用自己的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); 

希望这可以帮助。