2

从我的 C# 程序中,我打开 sql 连接并对表进行一些更新。之后我关闭连接。而且,如果我在 Management Studio 中的 Activity Monitor 下进行检查,则会创建新进程,即使我关闭了程序中的 sql 连接,该进程仍然存在于 Activity Monitor 中。我可以知道这个过程的行为吗?我们是否需要明确清除这些过程?谢谢。

4

2 回答 2

5

我认为您在这里错误地使用了过程的概念。

ADO.NET 使用connection pool. 这意味着当您Open在 SqlConnection 实例上调用该方法时,您并没有打开到数据库的新物理连接,您只是从现有池中绘制一个。当您调用时,Close您并没有关闭连接,您只是将其返回到连接池以供重用。

连接池存在于您的应用程序的进程中,并且是每个连接字符串。

我们是否需要明确清除这些过程?

不,您所要做的就是确保您已将所有IDisposable资源(例如连接和命令)包装在using语句中。这样,您甚至不需要显式调用 Close 方法,并且代码将确保即使在出现异常的情况下也能正确处理所有内容:

string connectionString = ...
using (var conn = new SqlConnection(connectionString))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "SELECT id FROM foo";
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            int id = reader.GetInt32(reader.GetOrdinal("id"));
            Console.WriteLine(id);
        }
    }
}
于 2013-03-15T07:24:48.703 回答
0

确保处理连接,最好的选择是 using()-block。

using ( var con = new SqlConnection("???") )
{
   using ( var cmd = con.CreateCommand() )
   {
      // do SQL with cmd
   }
}
于 2013-03-15T07:26:03.163 回答