我使用ADO.NET创建数据库。基本上,我在接下来的方式执行SQL命令:获取摆脱SqlConnection,关闭/处置后仍保留在活动监视器中
private bool ExecuteSqlCommand(string command)
{
var success = true;
using (var connection = GetSqlConnection())
{
if (connection == null)
return false;
using (var myCommand = new SqlCommand("query", connection))
{
try
{
connection.Open();
myCommand.CommandText = command;
myCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
success = false;
Log.LogMessage(string.Format("Unable to execute SQL command: {0}", ex.Message));
}
}
}
return success;
}
GetSqlConnection只是得到一些适当的SqlConnection与像
"Server={0}\\{1};User Id={2};Password={3};Application Name={4};"
它运作良好,并正确执行命令,但有一个例外的连接字符串 - 根据到Sql Manager Studio活动监视器,即使在执行方法后,它仍保持活动连接状态。
根据问题Why does my SqlConnection remain in the SSMS Processes list after closing it?,这是正确的行为,因为连接可能会被重用。但是serius问题是,那以后,READ_COMMITTED_SNAPSHOT
命令将被调用这个数据库,同时使用不同的SqlConnection。这导致异常,因为READ_COMMITTED_SNAPSHOT
要求,用于调用此命令的连接应该是数据库的唯一连接。
我不能重复使用此连接进行数据库的进一步操作,因为我使用不同的连接字符串,数据库指定为InitialCatalog(显然,我不能使用它,而数据库不存在)。
那么,我可以以某种方式删除这个初始连接?
试试这一个:[SqlConnection.ClearPool](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearpool) – Rafal
@Rafal,为什么?为什么你需要触摸连接轮询呢?我不认为这是无论如何与C#有关...而是连接如何管理DB端可能。 – Rahul
这是连接池的工作原理,它在处理后将数据库连接存储为打开状态,以最小化打开关闭进程。 – Rafal