ExecuteNonQuery需要一个开放且可用的连接.连接的当前状态已关闭

Tom*_*len 14 c# sql asp.net

ExecuteNonQuery需要一个开放且可用的连接.连接的当前状态已关闭.

我在这做错了什么?我假设你可以重用连接?

谢谢你的帮助!

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString()))
{
    cn.Open();

    // If we are reverting to an old type
    if (pageAction == "revert")
    {
        debug.Text = "FLAG 1";

        // Get the revert ID
        int revertingID = int.Parse(Request.QueryString["revID"]);
        bool rowsReturned = false;

        debug.Text = "FLAG 2 - " + revertingID.ToString();

        // Set all to 0
        using (SqlCommand cmd = new SqlCommand("SELECT ID FROM tblSiteSettings WHERE ID = " + revertingID, cn))
        {
            // If it exists
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            if (rdr.Read())
            {
                rowsReturned = true;
            }
            rdr.Close();
        }

        debug.Text = "FLAG 3 - " + rowsReturned.ToString();

        // Set new active and reset others
        if (rowsReturned == true)
        {
            using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 1 WHERE ID = " + revertingID, cn))
            {
                cmd.ExecuteNonQuery();
            }
            using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 0 WHERE ID <> " + revertingID, cn))
            {
                cmd.ExecuteNonQuery();
            }
        }
        //debug.Text = "FLAG 4 - ";
    }
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 18

你的问题是:

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Run Code Online (Sandbox Code Playgroud)

cmd.ExecuteReader()'如果你想在"摆脱"它之前再次使用连接,你应该打电话.如果您想了解该CommandBehaviour.CloseConnection部分的功能/意味着什么,那么SqlCommand.ExecuteReader的文档是一个不错的选择.还有一些文档可以告诉您CommandBehaviour枚举的所有可能值.基本上CommandBehaviour.CloseConnection做以下事项:

执行该命令时,关闭关联的DataReader对象时将关闭关联的Connection对象.

如果您没有特别需要指定CommandBehaviour,那么要么指定CommandBehaviour.Default,要么根本不指定.CommandBehaviour.Default是:

查询可以返回多个结果集.执行查询可能会影响数据库状态.默认设置没有CommandBehavior标志,因此调用ExecuteReader(CommandBehavior.Default)在功能上等同于调用ExecuteReader().


Dav*_*wns 5

您正在关闭连接,rdr.Close();并且在呼叫之前从不重新打开它ExecuteNonQuery().

实际上你根本不需要关闭它,如果它包含在一个using调用中,它Dispose()会自动为你关闭连接.