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