我有这段代码:
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是自动关闭还是我应该使用bool变量并在我的连接关闭后执行返回?
答案 0 :(得分:9)
您必须在返回前关闭连接。 最好的方法是USING block,因为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
{
...
}
}
}
}
答案 1 :(得分:4)
以下是改进代码的方法:
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())
{
...
}
}
}
}
这样您就不必担心关闭,处理......
答案 2 :(得分:3)
最好使用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
块,即使您返回,也会执行finally块并在Dispose
和{{{{}}上运行SqlCommand
1}}。
答案 3 :(得分:1)
正如其他人所指出的那样,SqlConnection实现了IDisposable。存在IDisposable,以便您可以控制何时释放资源。如果您没有自己调用Dispose,您的连接仍将自动关闭,但您无法控制何时可能发生这种情况(仅当垃圾收集器收集对象时会发生这种情况)