2011-09-06 50 views
0

Windowsサービス内のデータベースで挿入/更新イベントをキャプチャするためにSQL Server通知を使用したいと考えています。私は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

インスタンスを1つのインスタンスに変更しました。そして、私はSQL管理スタジオを使用して、データベースにテーブルに直接変更を加えていますが、サービスは実行中です。また、私はWindowsアプリケーションでこれを試して、それは正常に働いた。 – user930596

+0

多くの人がdependency_OnChange()イベントからNotificationListener()を呼び出す必要があるような戦略を見ていました。ちょうど試して。 – Thomas

関連する問題