gpt4 book ai didi

c# - 数据库删除后 SQL Server 2008 关闭连接

转载 作者:行者123 更新时间:2023-11-30 13:43:08 25 4
gpt4 key购买 nike

我在删除并重新创建给定数据库后遇到 SQL Server 删除连接的问题,下次我尝试针对同一数据库上的新连接执行命令时,我得到:

A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)

这是 TCP 版本(如果我尝试连接到另一台服务器)

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

以下是重现问题的步骤:

  1. 打开数据库连接并执行sql命令
  2. 删除数据库
  3. 重新创建数据库
  4. 打开与同一数据库的新连接并尝试对其运行命令

结果:我收到异常

代码如下:

using (var conn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=DBNAME;Integrated Security=True"))
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "UPDATE ...";
cmd.ExecuteNonQuery();
}

string sql = "Alter Database DBNAME set single_user with rollback immediate drop database DBNAME";
var server = new Microsoft.SqlServer.Management.Smo.Server(".");
server.ConnectionContext.ExecuteNonQuery(sql);
server.ConnectionContext.Disconnect();

sql = File.ReadAllText("PathToDotSqlFile..."));
server = new Microsoft.SqlServer.Management.Smo.Server(".");
server.ConnectionContext.ExecuteNonQuery(sql);
server.ConnectionContext.Disconnect();

using (var conn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=WER_CONFIG;Integrated Security=True"))
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "UPDATE ...";
cmd.ExecuteNonQuery();
}

错误发生在最后一行“cmd.ExecuteNonQuery()”。看来即使我每次连接时都在创建一个新连接,sql server 也会跟踪某些东西(或者可能是 ADO.net 代码),在我下次请求连接时,它会给我一个已经使用过的东西或已在服务器端关闭。它没有意识到它已被服务器关闭(可能是因为它连接到的数据库被删除),直到您尝试对它执行另一个命令。

请注意,如果我不执行执行初始查询的第一步,而只是删除数据库、重新创建它并执行命令,我就不会收到此错误。我认为在删除数据库之前建立初始连接是此错误的重要组成部分。

我也试过使用外部进程删除并重新创建数据库,如下所示:

ProcessStartInfo info = new ProcessStartInfo("sqlcmd.exe", " -e -E -S . -Q \"Alter Database DBNAME set single_user with rollback immediate drop database DBNAME\"");
var p = Process.Start(info);
p.WaitForExit();

info = new ProcessStartInfo("sqlcmd.exe", " -i " + PathToDotSqlFile);
p = Process.Start(info);
p.WaitForExit();

但这并没有帮助。

有没有办法创建一个新的 SqlConnection 并确保它是干净的而不是来自池?关于如何解决这个问题还有其他建议吗?

更新:使用 SqlConnection.ClearPool() 确实解决了问题,但我选择仅使用 pooling=false 编辑我的连接字符串,这也有效。

最佳答案

ADO.NET 自动管理一个连接池。当您“关闭”应用程序中的连接时,它会返回到池中并保持事件状态,以防您请求具有相同连接字符串的连接。这可能是您的"new"连接失效的原因。

您可以尝试通过将 pooling=false 作为参数添加到您的连接字符串来关闭此行为。

关于c# - 数据库删除后 SQL Server 2008 关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/821407/

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