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 可以随时释放,并且在理论上事件可能会在之后被触发,所以编译器会抱怨。