C#dependency_OnChange需要确定它来自哪里



我正在使用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可以在任何时候被处理,理论上事件可能会在之后被激发,因此编译器会抱怨。

相关内容

  • 没有找到相关文章

最新更新