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

时间:2010-08-23 13:35:27

标签: c# asp.net sql

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

5 个答案:

答案 0 :(得分:17)

你的问题是:

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()。

答案 1 :(得分:5)

您正在关闭连接rdr.Close();,并且在致电ExecuteNonQuery()之前从未重新打开它。

如果它被using包裹,你实际上根本不需要关闭它,因为对Dispose()的调用会自动关闭你的连接。

答案 2 :(得分:4)

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

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

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

SqlDataReader rdr = cmd.ExecuteReader();

或者这个

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

答案 3 :(得分:2)

只需添加cn.Open之前或不要关闭它。

答案 4 :(得分:1)

就在这里,您的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(); 
} 

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