c#关闭sqlconnection和sqldatareader与否?
问题描述:
我有这样一段代码:c#关闭sqlconnection和sqldatareader与否?
SqlConnection conn;
string strconString = System.Configuration.ConfigurationManager.ConnectionStrings["SQLCONN"].ToString();
conn = new SqlConnection(strconString);
string cmdstr = "select status from racpw where vtgid = " + vtgid;
SqlCommand cmdselect = new SqlCommand(cmdstr, conn);
conn.Open();
SqlDataReader dtr = cmdselect.ExecuteReader();
if (dtr.Read())
{
return;
}
else
{
...
}
dtr.Close();
conn.Close();
现在我的问题是。 如果回报,确实我的连接和DTR都会自动关闭,或者我应该使用布尔变量和我的连接都处在关闭后进行回报?
答
您必须关闭返回之前的连接。 最好的方式做到这一点是使用块,因为的SqlConnection实现了IDisposable接口。在这种情况下,您不必记住即使抛出异常也必须关闭连接。
请参见下面的例子:
using (var conn = new SqlConnection(strconString))
{
string cmdstr =
"select status from racpw where vtgid = " + vtgid;
using (var cmdselect = new SqlCommand(cmdstr, conn))
{
conn.Open();
using(var dtr = cmdselect.ExecuteReader())
{
if (dtr.Read())
{
return;
}
else
{
...
}
}
}
}
答
最好的办法是使用using
块来代替。这将强制调用Dispose
即使你在方法的中间返回:
string strconString = System.Configuration.ConfigurationManager
.ConnectionStrings["SQLCONN"].ToString();
using (SqlConnection conn = new SqlConnection(strconString))
{
string cmdstr =
"select status from racpw where vtgid = " + vtgid;
using(SqlCommand cmdselect = new SqlCommand(cmdstr, conn))
{
conn.Open();
using(SqlDataReader dtr = cmdselect.ExecuteReader())
{
if (dtr.Read())
{
return;
}
else
{
...
}
}
}
}
这工作,因为using
事实上是try/finally
块,即使你回来,最终被执行的块并运行Dispose
您SqlCommand
和SqlDataReader
。
答
下面是如何提高你的代码:
var connectionString = System.Configuration.ConfigurationManager
.ConnectionStrings["SQLCONN"].ToString();
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText =
"select status from racpw where vtgid = @vtgid";
cmd.Parameters.AddWithValue("@vtgid", vtgid);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
...
}
}
}
}
这样你就不需要担心收,处置,...
答
正如其他人指出,SqlConnection的实现IDisposable。存在IDisposable,以便您可以控制何时释放资源。如果你不调用Dispose你自己,你的连接仍然会自动关闭,但你有过当这可能发生(FYI其会在垃圾收集器收集的对象发生)
但他可能使用连接池无法控制。这意味着,垃圾收集器不会关闭连接。在那种情况下,当他尝试再次创建并打开新连接时,他将面临InvalidOperationException。 – Egor4eg 2010-12-08 09:47:14