c#是否关闭sqlconnection和sqldatareader?
我有一段代码:c#是否关闭sqlconnection和sqldatareader?,c#,sqldatareader,sqlconnection,C#,Sqldatareader,Sqlconnection,我有一段代码: SqlConnection conn; string strconString = System.Configuration.ConfigurationManager.ConnectionStrings["SQLCONN"].ToString(); conn = new SqlConnection(strconString); string cmdstr = "select status from racpw where vtgid = " + vtgid; SqlComman
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变量并在我的连接关闭后执行返回?您最好使用
而不是使用块。即使在方法的中间返回:,这将强制调用<代码>处理< /代码>。
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
{
...
}
}
}
}
这是因为使用
实际上是一个try/finally
块,即使返回,finally块也会在SqlCommand
和SqlDataReader
上执行并运行Dispose
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())
{
...
}
}
}
}
这样,您就不必担心关闭、处理等问题。您必须在返回之前关闭连接。
最好的方法是使用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
{
...
}
}
}
}
正如其他人所指出的,SqlConnection实现了IDisposable。IDisposable的存在使您可以控制何时释放资源。如果您自己不调用Dispose,您的连接仍将自动关闭,但您无法控制何时会发生这种情况(仅供参考,垃圾收集器收集对象时会发生这种情况)但他可能使用连接池。这意味着,连接不会被垃圾收集器关闭。在这种情况下,当他再次尝试创建和打开新连接时,他将面临InvalidOperationException。