2012-02-24 6 views
15

データベースに変更があった場合は、SQLDependencyを使用して通知します。 プログラムの起動後、正常に動作します。最初の変更を行うと、イベントが発生します。 Wohoo ...それは素晴らしいです。 しかし、私が2回目の変更を行った場合、イベントは再開しません。私は思ったすべてのウェブを検索しましたが、この問題については何も見つかりませんでした。 OnChangeイベントがループ内で発生する問題のみが見つかりました。 誰でも助けてくれますか?ここでSQLDependency_OnChange - イベントは1つだけ発生します。時刻

少しコードピース:

private void GetStates() 
    { 
     if (!DoesUserHavePermission()) 
      return; 

     SqlDependency.Stop(con); 
     SqlDependency.Start(con); 

     using (SqlConnection cn = new SqlConnection(con)) 
     { 
      using (SqlCommand cmd = cn.CreateCommand()) 
      { 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandText = "SELECT Bla, Bla2, ..FROM dbo.[BLA3]" 

       cmd.Notification = null; 
       cmd.Dispose(); 

       SqlDependency dep = new SqlDependency(cmd); 
       dep.OnChange += new OnChangeEventHandler(dep_OnChange); 

       cn.Open(); 

       using (SqlDataReader dr = cmd.ExecuteReader()) 
       { 
        state.Clear(); //In this Case "state" is a List<string> 
        while (dr.Read()) 
        { 
         state.Add(dr.GetString(0) + "|" + dr.GetInt32(3)); 
        } 
        dr.Dispose(); 
        dr.Close(); 
       }      
      } 
     } 
    } 

私のOnChangeイベントは次のようになります。

private void dep_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     SqlDependency dep = sender as SqlDependency; 
     dep.OnChange -= this.dep_OnChange; 

     using (SqlConnection cn = new SqlConnection(con)) 
     { 
      using (SqlCommand cmd = cn.CreateCommand()) 
      { 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandText = "SELECT Bla, Bla2, ..FROM dbo.[BLA3]"; 

       cmd.Notification = null; 

       if (e.Type == SqlNotificationType.Change) 
       { 
        if (cn.State != ConnectionState.Open) 
        { 
         cn.Open(); 
        } 

        using (SqlDataReader dr = cmd.ExecuteReader()) 
        { 
         state.Clear(); // Clear and Refill the stringlist "state" 
         while (dr.Read()) 
         { 
          state.Add(dr.GetString(0) + "|" + dr.GetInt32(3)); 
         } 
        } 
       } 
       cn.Close(); 
      } 
     } 
     this.GetStates(); //to go ahead and wait for a new change 
    } 

どこに問題がありますか?

using (SqlCommand cmd = cn.CreateCommand()) 
{ 
    ... 
    cmd.Dispose(); 

それはバグのようになります。それはあなたの問題があるが、あなたは、あなたがそれを作成した直後にコマンドを配置した場合

+0

最初のイベントコールの後でSqlDependencyを再度開始する必要があります。 2回目のイベントなどでは壊れません。それは完全に動作します。 – adnan

答えて

2

わかりません。

+0

Microsoftのサンプルコードでも同じことが行われています。私は両方の方法を試みましたが、そのイベントはまだ一度だけ起こっているようです。 – BlueMonkMN

8

私もこの問題に取り掛かっていました。新しいSqlDependencyエンティティを作成し(OnChangeイベントから既存のものをサブスクライブした後に)、新しいExecuteReaderコマンドを実行する必要があります。私はこの記事からアイデアを得た:

http://www.codeproject.com/Articles/12335/Using-SqlDependency-for-data-change-events

あなたが正常にデータを再照会したくなる変更が通知されたら、これは通常、理にかなっています。

1

は私の友人を見て:

dep.OnChange -= this.dep_OnChange; 

あなたのイベント未発射します。それは真実ではない。 この行を削除してください。 GETSTATESで

+2

毎回新しい依存関係が作成されるため、彼はそれを行う必要があります。これは1回の変更イベントです。 – Marshal

0

():

SqlDependency.Stop(con); SqlDependency.Start(con);

初めてSQL依存関係を登録するとき、これらの線にのみ実行されるべきです。

OnChangeイベントからメソッドを呼び出すときにそれらを制限します。

3

dep_OnChangeイベントの登録を解除した後で、に再度電話をかけて、dep.OnChangeイベントを再度初期化する必要があります。

関連する問題