已经有一个与此命令关联的打开的数据读取器,必须先关闭异常

Posted

技术标签:

【中文标题】已经有一个与此命令关联的打开的数据读取器,必须先关闭异常【英文标题】:There is already an open Data Reader associated with this Command which must be closed first Exception 【发布时间】:2017-05-05 15:43:46 【问题描述】:

我收到一个异常,称为“已经有一个打开的数据读取器与此命令关联,必须先关闭它,我尝试在 Google 上查找解决方案我尝试在连接字符串中使用 MARS=true 并将所有内容保留在 USING 中,但是它没有解决问题。 我得到一个例外 cm.ExecuteNonQuery();

public void UpdateActionSchedule(string actionScheduleKey, string note, string PEOPLE_CODE_ID)


    using (SqlConnection con = new SqlConnection("server=123; database=abc; user id=qwe; password=qwe;"))
    
        con.Open();

        if (note == "" || note == null)
        
            string UPDATE_COMPLETE = String.Format("UPDATE ACTIONSCHEDULE SET EXECUTION_DATE = '" + DateTime.Now + "', COMPLETED = 'Y', REVISION_OPID='WFLOW' where UNIQUE_KEY = '" + actionScheduleKey + "' and people_org_code_id='" + PEOPLE_CODE_ID + "'");
            SqlCommand cd = new SqlCommand(UPDATE_COMPLETE, con);
            cd.ExecuteNonQuery();
            cd.Dispose();
        
        else
        
            string oriNote = "";
            string GET_NOTE = String.Format("SELECT NOTE FROM ACTIONSCHEDULE WHERE people_org_code_id='0' and UNIQUE_KEY='1'", PEOPLE_CODE_ID, actionScheduleKey);
            using (SqlCommand cmd = new SqlCommand(GET_NOTE, con))
            
                // SqlDataReader dr = cmd.ExecuteReader();
                using (SqlDataReader dr = cmd.ExecuteReader())
                
                    if (dr.HasRows)
                    
                        while (dr.Read())
                        
                            oriNote = dr["NOTE"].ToString();
                        

                        note = oriNote + " " + note;
                     

                    //string UPDATE = String.Format("UPDATE ACTIONSCHEDULE SET Note = '" + note + "' where UNIQUE_KEY = '" + actionScheduleKey + "' and people_org_code_id='" + PEOPLE_CODE_ID + "'");
                    //SqlCommand cm = new SqlCommand(UPDATE, con);
                    //cm.ExecuteNonQuery();
                    //cm.Dispose();

                    string UPDATE_COMPLETE = String.Format("UPDATE ACTIONSCHEDULE SET EXECUTION_DATE = '" + DateTime.Now + "',Note = '" + note + "', COMPLETED = 'Y', REVISION_OPID='WFLOW' where UNIQUE_KEY = '" + actionScheduleKey + "' and people_org_code_id='" + PEOPLE_CODE_ID + "'");
                    SqlCommand cmw = new SqlCommand(UPDATE_COMPLETE, con);

                    cmw.ExecuteNonQuery();

                    cmw.Dispose();
                
            
        
    

【问题讨论】:

不相关:您需要参数化查询而不是进行字符串连接。这是relevant article as to why 好吧。这个错误对我来说似乎很清楚。您需要在发出最后一个更新命令之前调用 dr.Close。但实际上,您编写 sql 命令的方式非常危险。尽快用参数修复它。除了 SQL 注入之外,如果您的字段 NOTE 包含单引号,您认为会发生什么? 也不要显式调用 Dispose - 而是将代码包装在 using(var cmw = new SqlCommand(...)) 中。 @Steve dr.Close() 解决了这个问题,我会尝试使用参数,我是编码和学习的新手,通过在 youtube 上查看一些视频,感谢帮助我,它给出了异常未封闭的报价在字符串 '' 之后标记。而且我不知道如何给 cmets +1,否则我会给你。感谢您的帮助 【参考方案1】:

在代码的后半部分,您在cmd / dr 上有一个循环,并且该循环内,您使用cmwExecuteNonQuery。这意味着您正在尝试一次执行两个命令。由于您已经完成了循环:只需将该代码移到dr 上的using 之外

但是,看起来您也可以使用更好的 SQL 在一次往返中完成所有这些操作。

【讨论】:

以上是关于已经有一个与此命令关联的打开的数据读取器,必须先关闭异常的主要内容,如果未能解决你的问题,请参考以下文章

已经有一个打开的 DataReader 与此命令关联,必须先关闭

已经有一个打开的 DataReader 与此命令关联,必须先关闭

已经有一个与此命令关联的打开的 DataReader 必须首先关闭 linq [重复]

调用另一个 repo 时出错 - '已经有一个打开的 DataReader 与此命令关联,必须先关闭'

已经有一个打开的 DataReader 与此命令关联,必须先关闭

错误:已经有一个打开的 DataReader 与此命令关联,必须先关闭。多个用户