C# dependency_OnChange 需要确定它来自哪里?
C# dependency_OnChange Need to identify where it is coming from?
我正在使用 SQL dependency_OnChange 事件来了解 table 何时更新。来自多个数据库(相同模式不同的客户端)
但是,我已经检查了 SqlNotificationEventArgs 和 sender 对象,但都没有关于此更改事件来自哪个数据库实例的任何标识信息?
这是我创建依赖项的代码片段:
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 对象的信息(因为您有多个对象)。
您可以使用包装器 class 轻松地做到这一点,但最好使用短 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 可以随时释放,并且在理论上事件可能会在之后被触发,所以编译器会抱怨。
我正在使用 SQL dependency_OnChange 事件来了解 table 何时更新。来自多个数据库(相同模式不同的客户端)
但是,我已经检查了 SqlNotificationEventArgs 和 sender 对象,但都没有关于此更改事件来自哪个数据库实例的任何标识信息?
这是我创建依赖项的代码片段:
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 对象的信息(因为您有多个对象)。
您可以使用包装器 class 轻松地做到这一点,但最好使用短 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 可以随时释放,并且在理论上事件可能会在之后被触发,所以编译器会抱怨。