2009-08-21 32 views
4

我想我的Windows服務(用.NET編寫)識別何時將新行添加到特定的表中,而不是從sql服務器中提取數據,我想使用服務器推送模式。有沒有像Sql Server Tables的FileSystemWatcher?

有人對我有一個提示如何實現這一目標? 我使用SQL Server 2005的

TIA

回答

12

還有,如果你正在使用的客戶端ADO.NET使用C#或VB.NET

一個的SqlDependency對象可以是在一個SqlCommand相關 的ADO.NET SqlDependency機制訂購 來檢測查詢結果與最初檢索結果不同的 。您 也可以爲代理分配 OnChange事件,當 命令的結果更改 時將觸發此事件。您必須將 SqlDependency與執行該命令的 之前的命令相關聯。 SqlDependency的HasChanges屬性也可用於 確定查詢結果是否自 檢索到數據後 已更改。

你基本上關聯與你的SqlCommand一個SqlDependency,並提供事件處理程序被調用時,值組成結果集的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) 

} 

馬克

+0

這是一個很好的解決方案,可能是您的情況最好,但是,我很確定「服務器」(SQL服務器)不是「推」任何東西......我很好奇,但是,什麼* *是否正在進行? – 2009-08-21 14:35:21

+1

@Mike:服務器**是**推送。看到這裏:http://rusanu.com/2006/06/17/the-mysterious-notification/ – 2009-08-21 14:55:29

+2

@Marc:實際上查詢通知也可用於ODBC和OleDB客戶端:http://msdn.microsoft.com/zh-cn/ -us/library/ms130764.aspx – 2009-08-21 15:02:34

3

你會在SQL Server 2005中得到的最接近的是一個觸發。 Sql Server 2008也有更改數據捕獲。

1
+0

鑑於Notification Services在2008版本中再次迅速下降,我不會推薦基於此的新解決方案。 在發佈marc_s時,可以從託管代碼中使用SqlDependency/SqlNotificationRequest類。 – 2009-08-21 13:32:00

+0

我不知道它掉了。這並不像我在幾年內觸及過它。但是,OP明確指出他正在使用SQL Server 2005,所以它不會成爲問題。這就是說,你對marc_s的想法是一個更好的想法是正確的。不與外部服務分享責任似乎更好。 – 2009-08-21 14:18:27

0

你可以使用從數據庫中webservice call觸發。但我不知道如何對數據庫造成不利影響(如果有的話)。

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

希望這會有所幫助。