只是想知道,当这个方法完成时,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()
但只是好奇在这种情况下使用块如何工作。 干杯
答案 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)