当我们使用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);
}
}
答案 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
,您可以分别监控INSERT
,DELETE
,UPDATE
,并在事件args对象中接收实际更改的数据(xml
)。过滤传入的消息可帮助您实现所需的行为。希望这有帮助。