Sql依赖关系 - 在处理当前请求

时间:2017-04-25 17:41:12

标签: sql sql-server sqldependency query-notifications

我目前正在使用sql依赖关系通知来检测表中的更改并处理它们。我遇到了一个问题,即在完成第一个请求导致重复处理

的同时调用通知
private void ProcessData()
    {
        try
        {

                m_Guids = new List<Guid>();
                using (SqlCommand command = new SqlCommand("SP_XXX_SELECT", m_sqlConn))
                {
                    command.CommandType = CommandType.StoredProcedure;
                    command.Notification = null;

                    SqlDependency dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
                    SqlDependency.Start(m_ConnectionString, m_QueueName);

                    if (m_sqlConn.State == ConnectionState.Closed)
                    {
                        m_sqlConn.Open();
                    }

                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                m_Guids.Add(reader.GetGuid(0));
                            }
                        }
                    }
                    Console.WriteLine(m_Guids.Count.ToString());
                    ProcessGuids();
                }
            }
        }
        catch (Exception ex)
        {                
            //SendFailureEmail
        }
    }

private void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
    SqlDependency dependency = sender as SqlDependency;
    dependency.OnChange -= OnDependencyChange;
    ProcessData();
}    

public void OnStart()
{
    SqlDependency.Stop(m_ConnectionString, m_QueueName);
    SqlDependency.Start(m_ConnectionString, m_QueueName);
    m_sqlConn = new SqlConnection(m_ConnectionString);
}

ProcessData方法在处理过程中再次被调用(processGuids)我应该在处理完所有数据之后订阅该事件吗? 如果我在处理完成之前没有订阅,那么在此过程中更改的数据会发生什么变化,我相信在下一次更改发生之前不会收到通知?这样做的正确方法是什么,或者我做错了什么。 感谢

1 个答案:

答案 0 :(得分:1)

不仅在数据更改时调用SqlDependency.OnChange。

在OnDependencyChange中,您必须检查e.Type / e.Source / e.Info

F.e。,{Type = Subscribe, Source = Statement, Info = Invalid}的组合意味着&#34; 声明尚未准备好接收通知,未开始通知&#34;。 有关通知的SQL语句要求,请参阅Creating a Query for Notification。您必须在SP中的SELECT语句中遵循这些要求。

存储过程的其他要求没有详细记录。 SP的已知限制:

  • 禁止使用SET NOCOUNT(ON和OFF)。
  • 禁止使用RETURN。