2011-09-06 63 views
0

我想利用SQL Server通知在Windows服務中的數據庫中捕獲插入/更新事件。我正在嘗試使用SQLDependency對象。 MSDN文章使這看起來非常簡單。所以我創建了一個小示例應用程序來嘗試一下。當將數據更改到表中時,它不會引發看起來像的OnChange事件。有人能告訴我我錯過了什麼嗎?謝謝!我的代碼示例如下。SQL Server通知 - 我的OnChange不從Windows服務觸發

private bool CanRequestNotifications() 
{ 
    SqlClientPermission permit = new 
    SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted); 
    try 
    { 
     permit.Demand(); 
     return true; 
    } 
    catch (System.Exception exc) 
    { 
     return false; 
    } 
} 

private void NotificationListener() 
{ 
    string mailSQL; 
    SqlConnection sqlConn; 
    try 
    { 
     string connString = "Data Source=xyz;Initial Catalog=abc;User ID=sa;Password=******"; 
     mailSQL = "SELECT * FROM [tbl_test]"; 

     SqlDependency.Stop(connString); 
     SqlDependency.Start(connString); 

     sqlConn = new SqlConnection(connString); 
     SqlCommand sqlCmd = new SqlCommand(mailSQL, sqlConn); 
     this.GetNotificationData(); 
     evtLog.WriteEntry("Error Stage: NotificationListener" + "Error desc:" + "Message", EventLogEntryType.Error); 
    } 
    catch (Exception e) 
    { 
     // handle exception 
    } 
} 

private void GetNotificationData() 
{ 
    DataSet myDataSet = new DataSet(); 
    SqlCommand sqlCmd = new SqlCommand(); 
    sqlCmd.Notification = null; 

    SqlDependency dependency = new SqlDependency(sqlCmd); 
    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
    evtLog.WriteEntry("Error Stage: GetNotificationData" + "Error desc:" + "Message", EventLogEntryType.Error); 
} 

private void dependency_OnChange(object sender,SqlNotificationEventArgs e) 
{ 
    SqlDependency dependency = (SqlDependency)sender; 
    dependency.OnChange -= dependency_OnChange; 
    this.GetNotificationData(); 
    evtLog.WriteEntry("Error Stage: dependency_OnChange" + "Error desc:" + "Message", EventLogEntryType.Error); 
} 

protected override void OnStart(string[] args) 
{ 
    CanRequestNotifications(); 
    NotificationListener(); 
} 

protected override void OnStop() 
{ 
    SqlDependency dependency = new SqlDependency(); 
    dependency.OnChange -= dependency_OnChange; 
    SqlDependency.Stop(connString); 
} 

回答

0

看來,您使用的是新SqlDependency實例爲每個操作 - 這不會在長期運行工作;你應該有一個可以訪問那些需要它的代碼部分的單個實例的引用 - 這可能有助於解決你的問題。

此外,我實際上看不到您正在更改任何數據,您創建連接和命令,但沒有執行。

+0

我將實例更改爲單個實例。我正在使用SQL管理工作室在服務運行時將表中的更改直接轉換爲數據庫。此外,我在Windows應用程序中嘗試過,它工作正常。 – user930596

+0

我看到很多人有策略,像你需要從dependency_OnChange()事件調用NotificationListener()。你試一試。 – Thomas