C#依赖关系一旦发生变化,是否需要确定其来源?
我使用SQL dependency_OnChange事件来了解表何时更新。来自多个数据库(同一架构不同客户端) 但是,我已经检查了SqlNotificationEventArgs和sender对象,没有任何关于此更改事件来自哪个DB实例的标识信息 下面是我创建依赖项的代码段:C#依赖关系一旦发生变化,是否需要确定其来源?,c#,sql,sqldependency,C#,Sql,Sqldependency,我使用SQL dependency_OnChange事件来了解表何时更新。来自多个数据库(同一架构不同客户端) 但是,我已经检查了SqlNotificationEventArgs和sender对象,没有任何关于此更改事件来自哪个DB实例的标识信息 下面是我创建依赖项的代码段: using (var conn = new SqlConnection(connectionString)) { conn.O
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+=(发送方,e)=>dependency\u OnChange(发送方,e,conn.DataSource)
并将事件处理程序函数的签名更改为私有静态void dependency\u OnChange(对象发送方、SqlNotificationEventArgs e、字符串数据源)
你会得到这样的结果:
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可以在任何时候被释放,理论上,事件可能会在之后被触发,因此编译器会抱怨。谢谢您,不幸的是,当conn.DataSource到达onchange事件时,它看起来好像丢失了。根据lambda表达式的想法,我成功地传递了连接字符串,但没有传递数据源,因此不确定那里发生了什么。但是有了这个,我可以做一些字符串操作,得到我需要的东西。非常感谢。