执行NonQuery需要一个打开和可用的连接。连接的当前状态是关闭的。

16

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

对于任何搜索德语错误消息的人,例如:"'ExecuteNonQuery erfordert eine geöffnete und verfügbare Connection. Der aktuelle Status der Verbindung ist 'Geschlossen'.'"。 - Uwe Keim
5个回答

20

你的问题是:

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
如果您希望在“摆脱”连接之前再次使用它,则应只需调用cmd.ExecuteReader()。如果您想了解CommandBehaviour.CloseConnection的含义,那么可以查看SqlCommand.ExecuteReader文档。还有文档可以告诉您所有可能的CommandBehavior枚举值是什么。基本上,CommandBehaviour.CloseConnection执行以下操作:

当DataReader对象关闭时,关联的Connection对象也会关闭。

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

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


当Using()语句处置SqlCommand时,它包装的命令是否也会关闭连接? - Tommy
@Tommy,据我所知不是 - SqlCommand.Dispose 的文档没有提到它,所以我认为不是(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.dispose.aspx) - Rob
不错的想法,如果连接定义被包含在Using块中,那么它就会关闭。https://dev59.com/mkbRa4cB1Zd3GeqPxiIA - Tommy
1
非常感谢。我有几个实例,但它们没有使用这个,除了一个,只有一个,而那个该死的东西在过去几个小时一直让我抓狂。非常感谢。 - Wayne Barron

6

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

如果使用了using,则实际上根本不需要关闭它,因为调用Dispose()会自动为您关闭连接。


4

看起来你在执行ExecuteNonQuery之前进行了读取。 在第一次调用SqlCommand(用于SELECT)时,你在读取完成后关闭了连接。

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

如果删除命令行为,你应该可以正常运行,或者在下一个if语句中重新打开连接。

这个

SqlDataReader rdr = cmd.ExecuteReader();

或者这个

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

3

只需在之前添加cn.Open,或者不要将其关闭。


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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接