SQL中的SQL依赖项和数据引用

时间:2015-04-21 19:40:52

标签: c# sql-server sqldependency

当我们使用sql依赖时,我们需要总是引用一个像SELECT ActivityDate FROM [bba-reman].MyLog下面的sql

我只想知道我是否以这种方式编写上述sql然后才能正常工作

SELECT TOP 1 ActivityDate FROM [bba-reman].MyLog

SELECT TOP 5 ActivityDate FROM [bba-reman].MyLog

我正在寻找建议和指导。

private void RegisterNotification()
{
    string tmpdata = "";
    System.Data.SqlClient.SqlDependency.Stop(connectionString);
    System.Data.SqlClient.SqlDependency.Start(connectionString);

    try
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            SqlCommand cmd = conn.CreateCommand();

            cmd.CommandText = "SELECT ActivityDate FROM [bba-reman].MyLog";
            dep = new SqlDependency(cmd);
            dep.OnChange += new OnChangeEventHandler(OnDataChange);

            SqlDataReader dr = cmd.ExecuteReader();
            {
                while (dr.Read())
                {
                    if (dr[0] != DBNull.Value)
                    {
                        tmpdata = dr[0].ToString();
                    }
                }
            }

            dr.Dispose();
            cmd.Dispose();
        }
    }
    finally
    {
        //SqlDependency.Stop(connStr);
    }
}

2 个答案:

答案 0 :(得分:1)

根据SQL Server联机丛书(https://msdn.microsoft.com/en-us/library/t9x04ed2.aspx),使用QueryNotifications的一个限制是该语句不能使用TOP表达式。 SqlDependency只是一个更高级别的QueryNotifications实现,它负责Service Broker管道。

答案 1 :(得分:0)

SqlDependency类有很多限制以及内存泄漏problems。缺少TOP指令就是其中之一。 Hovewer,您可以使用SqlDependency类的开源实现 - SqlDependencyEx。它使用数据库触发器和本机Service Broker通知来接收有关表更改的事件。这是一个用法示例:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

使用SqlDependecyEx,您可以分别监控INSERTDELETEUPDATE,并在事件args对象中接收实际更改的数据(xml)。过滤传入的消息可帮助您实现所需的行为。希望这有帮助。