Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql依赖关系-处理当前请求之前收到的通知_Sql_Sql Server_Sqldependency_Query Notifications - Fatal编程技术网

Sql依赖关系-处理当前请求之前收到的通知

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

我目前正在使用sql依赖项通知来检测表中的更改并对其进行处理。我遇到了一个问题,当通知仍然在完成第一个请求的中间时,导致重复处理< /P>。
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(开和关)
  • 禁止使用退货