2012-02-24 252 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事件。

相关问题