处置Sql连接

时间:2009-10-19 15:48:19

标签: sql-server ado.net

只是想知道,当这个方法完成时,SqlConnection会被取消/关闭吗?或者我必须在结束时明确调用close方法吗?

   using (SqlCommand cmd = new SqlCommand(sql, GetConnection()))
   {
       SqlDataReader reader = cmd.ExecuteReader();
       while (reader.Read())
       {
       }
   }

SqlConnection GetConnetion()
{
 return new SqlConnection("connectionstring");
}

我知道我可以这样做:

SqlConnection conn = GetConnetion();
SqlCommand cmd =new SqlCommand(sql, conn);
//Do Something
conn.Close()
cmd.Dispose()

但只是好奇在这种情况下使用块如何工作。 干杯

6 个答案:

答案 0 :(得分:17)

不,连接对象不会自动在您的示例中处理。 using块仅适用于SqlCommand对象,而不适用于连接。

要确保处置连接,请确保SqlConnection对象包含在其自己的using块中:

using (SqlConnection conn = GetConnection())
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
    // don't forget to actually open the connection before using it
    conn.Open();
    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // do something
        }
    }
}

答案 1 :(得分:2)

Luke的答案是关于处理连接的具体问题。

为了完整性,您还可以使用SqlCommand.ExecuteReader(CommandBehaviour)方法而不是无参数方法,传入CommandBehvaiour.CloseConnection

using (SqlCommand cmd = new SqlCommand(sql, GetConnection()))
{
    using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
    {
        while (reader.Read())
        {}
    }
}

这表示当SqlDataReader关闭时(当它在使用构造中被丢弃时),它将依次关闭它正在使用的连接。

我并不热衷于这种方法,因为有一些隐含的逻辑,并且关闭连接究竟是什么并不明显。

答案 2 :(得分:1)

using语句将为您解决此问题。

答案 3 :(得分:0)

糟糕。您希望在连接上使用,而不是在命令上使用。

答案 4 :(得分:0)

使用using但是在连接上,而不是在SqlCommand上。连接上的Dispose方法将关闭连接(如果启用了池,则将其返回到池)。也可以在SqlDataReader周围使用:

using(SqlConnection conn = GetConnection())
{
  SqlCommand cmd = new SqlCommand(sql, conn);
  using (SqlDataReader reader = cmd.ExecuteReader())
  {
    do 
    {
      while (reader.Read())
      {
      }
    } while (reader.NextResult());
  } 
}

答案 5 :(得分:0)

HereHere可以帮助您了解正在发生的事情。