【问题标题】:ExecuteNonQuery requires an open and available Connection. The connection's current state is closedExecuteNonQuery 需要一个开放且可用的连接。连接的当前状态为关闭
【发布时间】:2011-04-02 15:51:33
【问题描述】:

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 - ";
    }

【问题讨论】:

  • 对于任何在谷歌上搜索德语错误消息的人,它 e。 G。内容为:“'ExecuteNonQuery erfordert eine geöffnete und verfügbare Connection. Der aktuelle Status der Verbindung ist 'Geschlossen'.'”。

标签: c# asp.net sql


【解决方案1】:

你的问题是:

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

如果您想在“摆脱”连接之前再次使用该连接,您应该致电cmd.ExecuteReader()'。如果您想了解CommandBehaviour.CloseConnection 部分的作用/含义,那么SqlCommand.ExecuteReader 的文档是一个不错的选择。还有文档告诉您CommandBehaviour enumeration 的所有可能值是什么。本质上,CommandBehaviour.CloseConnection 做了以下事情:

命令执行时,关闭关联的DataReader对象时,关闭关联的Connection对象。

如果您没有特殊需要指定 CommandBehaviour,则指定 CommandBehaviour.Default,或者根本不指定。 CommandBehaviour.Default 是:

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

【讨论】:

【解决方案2】:

您正在关闭连接 rdr.Close(); 并且在调用 ExecuteNonQuery() 之前永远不会重新打开它。

如果它包含在 using 中,则您实际上根本不需要关闭它,因为对 Dispose() 的调用将自动为您关闭连接。

【讨论】:

    【解决方案3】:

    您在执行 ExecuteNonQuery 之前似乎正在阅读。在您第一次调用 SqlCommand(对于 SELECT)时,您将在读取完成后关闭连接。

    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    

    删除命令行为,你应该很好,或者在你的下一个 if 语句中重新打开连接。

    这个

    SqlDataReader rdr = cmd.ExecuteReader();
    

    或者这个

    if (rowsReturned == true){
       cn.open();
    

    【讨论】:

      【解决方案4】:

      在前面加cn.Open就行了,不然不要关闭。

      【讨论】:

        【解决方案5】:

        在这里,您的 SqlDataReader 将在完成后关闭连接:

        // 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(); 
        } 
        

        稍后,“设置新的活动并重置其他”部分将失败,因为连接已关闭。

        【讨论】:

          猜你喜欢
          • 2015-04-17
          • 2012-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-03
          相关资源
          最近更新 更多