0

我目前正在使用 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) 我应该在处理完所有数据后订阅事件吗?如果我在处理完成之前不订阅,那么在处理过程中更改的数据会发生什么情况,我相信在下一次更改发生之前不会收到通知?这样做的正确方法是什么,或者我做错了什么。谢谢

4

1 回答 1

1

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

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

Fe,组合{Type = Subscribe, Source = Statement, Info = Invalid}表示“ Statement not ready for notification,没有通知开始”。有关通知的 SQL 语句要求,请参阅创建通知查询。您必须在 SP 中的 SELECT 语句中遵循这些要求。

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

  • 禁止使用 SET NOCOUNT(ON 和 OFF)。
  • 禁止使用 RETURN。
于 2017-09-04T10:45:10.627 回答