c#关闭sqlconnection和sqldatareader与否?

时间:2010-12-08 09:19:58

标签: 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;
SqlCommand cmdselect = new SqlCommand(cmdstr, conn);
conn.Open();
SqlDataReader dtr = cmdselect.ExecuteReader();
if (dtr.Read())
{
return;
}
else
{
...
}
dtr.Close();
conn.Close();

现在我的问题是。 如果返回,我的连接和dtr是自动关闭还是我应该使用bool变量并在我的连接关闭后执行返回?

4 个答案:

答案 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,您的连接仍将自动关闭,但您无法控制何时可能发生这种情况(仅当垃圾收集器收集对象时会发生这种情况)