【发布时间】:2009-05-04 18:58:16
【问题描述】:
我在删除并重新创建给定数据库后遇到 SQL Server 删除连接的问题,下次我尝试针对同一数据库上的新连接执行命令时,我得到:
向服务器发送请求时发生传输级错误。 (提供者:共享内存提供者,错误:0 - 管道的另一端没有进程。)
这是 TCP 版本(如果我尝试连接到另一台服务器)
向服务器发送请求时发生传输级错误。 (提供者:TCP Provider,错误:0 - 现有连接被远程主机强行关闭。)
以下是重现问题的步骤:
- 打开与数据库的连接并执行 sql 命令
- 删除数据库
- 重新创建数据库
- 打开与同一数据库的新连接并尝试对其运行命令
结果:我收到异常
代码如下:
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 编辑我的连接字符串,这也有效。
【问题讨论】:
标签: c# .net sql sql-server sql-server-2008