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是自动关闭还是我应该使用bool变量并在我的连接关闭后执行返回?

您必须在返回前关闭连接。 最好的方法是USING block,因为SqlConnection实现了IDisposable接口。 在这种情况下,您不必记住即使抛出exception也必须关闭连接。

请参阅以下示例:

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

以下是改进代码的方法:

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

这样你就不用担心关闭,处理……

你最好选择使用一个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块并在你的SqlCommandSqlDataReader上运行Dispose

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