C#依赖关系一旦发生变化,是否需要确定其来源?

C#依赖关系一旦发生变化,是否需要确定其来源?,c#,sql,sqldependency,C#,Sql,Sqldependency,我使用SQL dependency_OnChange事件来了解表何时更新。来自多个数据库(同一架构不同客户端) 但是,我已经检查了SqlNotificationEventArgs和sender对象,没有任何关于此更改事件来自哪个DB实例的标识信息 下面是我创建依赖项的代码段: using (var conn = new SqlConnection(connectionString)) { conn.O

我使用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+=(发送方,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表达式的想法,我成功地传递了连接字符串,但没有传递数据源,因此不确定那里发生了什么。但是有了这个,我可以做一些字符串操作,得到我需要的东西。非常感谢。