Sql依赖关系-处理当前请求之前收到的通知
我目前正在使用sql依赖项通知来检测表中的更改并对其进行处理。我遇到了一个问题,当通知仍然在完成第一个请求的中间时,导致重复处理< /P>。Sql依赖关系-处理当前请求之前收到的通知,sql,sql-server,sqldependency,query-notifications,Sql,Sql Server,Sqldependency,Query Notifications,我目前正在使用sql依赖项通知来检测表中的更改并对其进行处理。我遇到了一个问题,当通知仍然在完成第一个请求的中间时,导致重复处理< /P>。 private void ProcessData() { try { m_Guids = new List<Guid>(); using (SqlCommand command = new SqlCommand("SP_XXX_SELECT
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);
}
private void ProcessData()
{
尝试
{
m_Guids=新列表();
使用(SqlCommand命令=新的SqlCommand(“SP_XXX_SELECT”,m_sqlConn))
{
command.CommandType=CommandType.storedProcess;
command.Notification=null;
SqlDependency=新的SqlDependency(命令);
dependency.OnChange+=新的OnChangeEventHandler(OnDependencyChange);
Start(m_ConnectionString,m_QueueName);
if(m_sqlConn.State==ConnectionState.Closed)
{
m_sqlConn.Open();
}
使用(SqlDataReader=command.ExecuteReader())
{
if(reader.HasRows)
{
while(reader.Read())
{
m_Guids.Add(reader.GetGuid(0));
}
}
}
Console.WriteLine(m_Guids.Count.ToString());
ProcessGuids();
}
}
}
捕获(例外情况除外)
{
//发送失败电子邮件
}
}
私有void OnDependencyChange(对象发送方,SqlNotificationEventArgs e)
{
SqlDependency=发送方作为SqlDependency;
dependency.OnChange-=OnDependencyChange;
ProcessData();
}
public void OnStart()
{
SqlDependency.Stop(m_ConnectionString,m_QueueName);
Start(m_ConnectionString,m_QueueName);
m_sqlConn=新的SqlConnection(m_ConnectionString);
}
< P>过程数据方法再次调用,而它仍然处于处理中间(PrimeGuIDs),在处理所有数据之后是否应该订阅事件?
如果我在处理完成之前不订阅,那么在处理过程中更改的数据会发生什么情况?我相信在下次更改之前不会收到通知?。做这件事的正确方法是什么,或者我做错了什么。
谢谢,SqlDependency.OnChange不仅在数据更改时被调用 在OnDependencyChange中,必须选中
e.Type
/e.Source
/e.Info
例如,{Type=Subscribe,Source=Statement,Info=Invalid}
的组合表示“语句未准备好通知,未启动通知”。
有关通知的SQL语句要求,请参阅。您必须遵守SP中SELECT语句中的这些要求
存储过程的附加要求没有很好的记录。SP的已知限制:
- 禁止使用SET NOCOUNT(开和关)
- 禁止使用退货