2012-02-24 248 views
15

我正在使用SQLDependency來通知我數據庫是否有更改。 程序啓動後,它工作得很好。當我第一次改變時,事件就會發生。 Wohoo ......很好。 但是,如果我做了第二次更改,事件不會再次觸發。我搜索了所有我認爲是網絡的網頁,但沒有發現任何有關此問題的信息。只有發現OnChange-Event在循環中觸發的問題。 任何人都可以幫助我嗎?SQLDependency_OnChange-事件只觸發一個時間

這裏有點一段代碼:

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 
    } 

問題出在哪裏?

+0

您必須在第一次事件調用後再次啓動SqlDependency。所以它不會爲第二個事件而打破等等。它會完美地工作。 – adnan 2015-12-25 04:49:53

回答

2

不知道這是你的問題,但你處理你已經創建後馬上命令:

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

它看起來像一個錯誤。

+0

Microsoft示例代碼執行相同的操作。我已經嘗試了兩種方式,而且這個事件似乎仍然只會觸發一次。 – BlueMonkMN 2013-03-11 17:46:53

1

看我的朋友:

dep.OnChange -= this.dep_OnChange; 

你未經燒製的事件;這是不正確的; 只是刪除這一行;

+2

他需要這樣做,因爲每次都會創建一個新的依賴關係。這是一次性改變事件。 – Marshal 2015-10-08 12:23:24

0

在GETSTATES():

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

登記爲第一次的sql依賴性當這些線應當僅執行。

從OnChange事件調用方法時限制它們。

3

在您取消訂閱dep_OnChange事件後,您應該再次調用private void GetStates()來初始化dep.OnChange事件。

相關問題