gpt4 book ai didi

c# - Db Connection.State Change 什么时候调用?

转载 作者:可可西里 更新时间:2023-11-01 08:42:54 27 4
gpt4 key购买 nike

我有以下代码:

   class Program
{
static void Main()
{
var connection = new SqlConnection("myConnectionString");
connection.Open();
connection.StateChange += HandleSqlConnectionDrop;
Console.WriteLine("Hi");
Console.ReadLine();
}

private static void HandleSqlConnectionDrop(object connection, StateChangeEventArgs args)
{
Console.WriteLine("DB change detected");
}
}

我在 SQL 服务器实例运行时启动上面的代码。然后我继续执行

SHUTDOWN WITH NOWAIT;

在程序连接到的 sql server 实例上。然后我观察到 SQL 服务器服务停止。但是,我从未在输出中看到“检测到数据库更改”消息。这是为什么?

旁白:如果我随后尝试对 SQL 连接执行操作,我将看到 StateChange 处理程序被调用,但之前从未发生过。有没有办法改变这种行为?

最佳答案

When is DbConnection.StateChange called?

您可以通过查看 Microsoft 引用源代码找到答案。

StateChange 事件由 DbConnection.OnStateChange 函数引发。查找对此函数的引用只会产生几个实例:

首先,在SqlConnection类中,OnStateChange只在Close方法中调用。

然后在 DbConnectionHelper.cs 文件中,有一个名为 DBCONNECTIONOBJECT 的部分类。它看起来像是用于所有 DbConnection 的派生类,使用了一些构建时的恶作剧。所以你可以认为它是 SqlConnection 的一部分。在任何情况下,它仅从 SetInnerConnectionEvent 函数内部调用 OnStateChange

据我所知(部分类废话让它变得困难),SqlConnection.SetInnerConnectionEvent 仅从 SqlConnectionFactory.SetInnerConnectionEvent 调用。 那个是从以下地方调用的:

因此,总而言之 - 事件仅在响应客户端操作时引发 - 似乎没有对 SQLConnection 中内置的连接状态进行任何轮询。

Is there a way this behavior can be changed?

看源码,没看出来。正如其他人所建议的那样,您当然可以实现自己的轮询。

关于c# - Db Connection.State Change 什么时候调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37442983/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com