Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#是否关闭sqlconnection和sqldatareader?_C#_Sqldatareader_Sqlconnection - Fatal编程技术网

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。