gpt4 book ai didi

c# - SqlConnection 超时异常

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:11 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题,即连接尝试的剩余超时似乎在多次尝试后仍然存在。

我有一个输入连接信息的简单窗口,带有一个连接和取消按钮。

当用户点击连接时,执行以下代码:

 DisableControls();
if((bool)AutoAuthenticated.IsChecked)
{
((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
("server="+ServerName.Text + ";"+
"Trusted_Connection=yes;" +
"database="+DatabaseName.Text + ";" +
"connection timeout=3");
}
else
{
((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
("user id="+UserName.Text+";" +
"password="+Password.Password+";" +
"server="+ServerName.Text+";" +
"Trusted_Connection=no;" +
"database="+DatabaseName.Text+";" +
"connection timeout=3");
}

await ConnectToServer();

这是 ConnectToServer 函数:

private async Task ConnectToServer()
{
//using (((MainWindow)Owner).myConnection)
//{
await ((MainWindow)Owner).myConnection.OpenAsync();
//}
}

出于测试目的,超时属性现在很小。

无论如何,如果用户在连接时点击取消按钮:

private void Cancel_Click(object sender, RoutedEventArgs e)
{
if (((MainWindow)Owner).myConnection != null &&
((MainWindow)Owner).myConnection.State ==
System.Data.ConnectionState.Connecting)
{
((MainWindow)Owner).myConnection.Close();
EnableControls();
}
else
{
this.Close();
}
}

现在,如果我输入伪造的详细信息并让它超时,那么我会捕获“找不到网络路径”的异常。

如果我在此之后尝试再次连接(或者可能是在下一次尝试之后再次连接,这取决于我按下取消按钮的速度),它在按下连接按钮后几乎立即超时,而无需等待时间它应该是。

我不确定我在这里做错了什么,我尝试过重新设置 SqlConnection 对象,但我认为每次我点击连接时将其设置为新的 SqlConnection 应该已经这样做了吗?

最佳答案

我发现我错过了什么。即使关闭连接,处理对象,将其全部保存在 using 语句中,问题仍然存在,因为还有另一个我不知道的元素 - 连接池。

我仍然需要对此进行一些阅读,但基本上它会重用旧的连接信息等以节省资源等。

还有更多信息here ,但如果这对遇到类似问题的其他人有帮助,只需在关闭连接时调用 ClearPool() 函数:

示例(在我的异常处理代码中,在我调用 Close() 之后):

System.Data.SqlClient.SqlConnection.ClearPool(((MainWindow)Owner).myConnection);

显然,从资源使用的角度来看,最好仅在不需要重用连接时才调用该函数,但话虽如此,我仍然需要阅读相关内容,所以请不要相信我的话为了它!

关于c# - SqlConnection 超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16959914/

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