2016-11-23 63 views
0

我使用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(显然,我不能使用它,而数据库不存在)。

那么,我可以以某种方式删除这个初始连接?

+1

试试这一个:[SqlConnection.ClearPool](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearpool) – Rafal

+1

@Rafal,为什么?为什么你需要触摸连接轮询呢?我不认为这是无论如何与C#有关...而是连接如何管理DB端可能。 – Rahul

+2

这是连接池的工作原理,它在处理后将数据库连接存储为打开状态,以最小化打开关闭进程。 – Rafal

回答

相关问题