我正在使用SQL dependency_OnChange事件来了解表何时更新。来自多个数据库(相同模式不同客户端(
但是,我检查了SqlNotificationEventArgs和sender对象,都没有任何关于此更改事件来自哪个DB实例的标识信息?
以下是我创建依赖项的片段:
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
var cmd = new SqlCommand("SELECT... WHERE....");
cmd.Connection = conn;
var dependency = new SqlDependency(cmd);
dependency.OnChange += dependency_OnChange;
SqlDependency.Start(connectionString);
cmd.ExecuteNonQuery();
}
以及OnChange方法的签名:
private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
//Foo
}
如何确定更改发生在哪个数据库实例中?
更新:根据K.Gabor关于使用Lambda表达式的建议,我设法将连接字符串添加到事件处理程序中,如下所示:
dependency.OnChange += (sender, e) => dependency_OnChange(sender, e, connectionString);
如果我理解正确,您希望在事件处理程序函数中检索有关SqlConnection对象的信息(因为您有多个对象(。
使用包装类可以很容易地做到这一点,但最好使用短lambda。
请尝试以下操作:dependency.OnChange += (sender, e) => dependency_OnChange(sender, e, conn.DataSource);
并将事件处理程序函数的签名更改为private static void dependency_OnChange(object sender, SqlNotificationEventArgs e, string dataSource)
。
你会得到这样的东西:
static void Main(string[] args)
{
SqlDependency.Start(connectionString);
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
var cmd = new SqlCommand("SELECT * FROM test_table",
conn);
var dependency = new SqlDependency(cmd);
dependency.OnChange += (sender, e) => dependency_OnChange(sender, e, conn.DataSource);
cmd.ExecuteNonQuery();
Console.WriteLine("Waiting for something to happen press any key to exit!");
Console.ReadKey();
}
SqlDependency.Stop(connectionString);
}
private static void dependency_OnChange(object sender, SqlNotificationEventArgs e, string dataSource)
{
Console.WriteLine("Change registered!");
}
您可以传递整个SqlConnection对象或它的任何属性(而不是数据源字符串(,但这可能不是最好的方法,因为SqlConnection可以在任何时候被处理,理论上事件可能会在之后被激发,因此编译器会抱怨。