的ExecuteNonQuery需要一个开放和可用的连接。连接的当前状态为关闭 [英] ExecuteNonQuery requires an open and available Connection. The connection's current state is closed

查看:256
本文介绍了的ExecuteNonQuery需要一个开放和可用的连接。连接的当前状态为关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我是什么错在这里做什么?我假设你可以重复使用的连接?



感谢您的帮助!



 使用(SqlConnection的CN =新的SqlConnection(ConfigurationManager.ConnectionStrings [LocalSqlServer这个]的ToString())。)
{
cn.Open();

//如果我们要恢复到一个旧型
如果(pageAction ==恢复)
{
debug.Text =标志1;

//获取复归ID
INT revertingID = int.Parse(的Request.QueryString [REVID]);
布尔按照RowsReturned = FALSE;

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

//使用将所有为0
(CMD的SqlCommand =新的SqlCommand(SELECT ID FROM tblSiteSettings WHERE ID =+ revertingID,CN))
{
//如果存在
SqlDataReader的RDR = cmd.ExecuteReader(CommandBehavior.CloseConnection);如果
(rdr.Read())
{
按照RowsReturned = TRUE;
}
rdr.Close();
}

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

//如果(按照RowsReturned ==真)
{
使用设置新的活动和重置等
(CMD的SqlCommand =新的SqlCommand(UPDATE tblSiteSettings SET isActive = 1 WHERE ID =+ revertingID,CN))
{
cmd.ExecuteNonQuery();
}使用
(的SqlCommand CMD =新的SqlCommand(UPDATE tblSiteSettings SET isActive = 0 WHERE ID<>中+ revertingID,CN))
{
cmd.ExecuteNonQuery( );
}
}
//debug.Text =FLAG 4 - ;
}


解决方案

您的问题是:

  SqlDataReader的RDR = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

您应该只需要调用 cmd.ExecuteReader()如果你想用它来摆脱前再次连接。如果你想获得的 CommandBehaviour.CloseConnection 部分所做的理解/那么意味着的 SqlCommand.ExecuteReader 是一个不错的选择。还有文档,告诉你什么的 CommandBehaviour枚举是。从本质上讲 CommandBehaviour.CloseConnection 执行以下操作:




在执行命令时,当相关DataReader对象被关闭相关的Connection对象是关闭的。




如果你没有特殊需要指定一个CommandBehaviour,然后要么指定 CommandBehaviour.Default 或不指定一个在所有。 CommandBehaviour.Default是:




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



ExecuteNonQuery requires an open and available Connection. The connection's current state is closed.

What am I doing wrong here? I'm assuming you can reuse the connection?

Thanks for any help!

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

解决方案

Your problem is:

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

You should just call cmd.ExecuteReader()' if you want to use the connection again prior to "getting rid" of it. If you want to get an understanding for what the CommandBehaviour.CloseConnection part does/means then the documentation for SqlCommand.ExecuteReader is a good bet. There's also documentation to tell you what all the possible values of the CommandBehaviour enumeration are. Essentially CommandBehaviour.CloseConnection does the following:

When the command is executed, the associated Connection object is closed when the associated DataReader object is closed.

If you have no special need to specify a CommandBehaviour, then either specify CommandBehaviour.Default, or don't specify one at all. CommandBehaviour.Default is:

The query may return multiple result sets. Execution of the query may affect the database state. Default sets no CommandBehavior flags, so calling ExecuteReader(CommandBehavior.Default) is functionally equivalent to calling ExecuteReader().

这篇关于的ExecuteNonQuery需要一个开放和可用的连接。连接的当前状态为关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆