2010-12-08 85 views
4

我有这样一段代码: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都会自动关闭,或者我应该使用布尔变量和我的连接都处在关闭后进行回报?

回答

9

您必须关闭返回之前的连接。 最好的方式做到这一点是使用块,因为的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 
      { 
       ... 
      } 
     } 
    } 
} 
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块,即使你回来,最终被执行的块并运行DisposeSqlCommandSqlDataReader

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()) 
      { 
       ... 
      } 
     } 
    } 
} 

这样你就不需要担心收,处置,...

1

正如其他人指出,SqlConnection的实现IDisposable。存在IDisposable,以便您可以控制何时释放资源。如果你不调用Dispose你自己,你的连接仍然会自动关闭,但你有过当这可能发生(FYI其会在垃圾收集器收集的对象发生)

+0

但他可能使用连接池无法控制。这意味着,垃圾收集器不会关闭连接。在那种情况下,当他尝试再次创建并打开新连接时,他将面临InvalidOperationException。 – Egor4eg 2010-12-08 09:47:14

相关问题