已经有一个与此命令关联的打开的数据读取器,必须先关闭异常
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
上有一个循环,并且在该循环内,您使用cmw
和ExecuteNonQuery
。这意味着您正在尝试一次执行两个命令。由于您已经完成了循环:只需将该代码移到dr
上的using
之外。
但是,看起来您也可以使用更好的 SQL 在一次往返中完成所有这些操作。
【讨论】:
以上是关于已经有一个与此命令关联的打开的数据读取器,必须先关闭异常的主要内容,如果未能解决你的问题,请参考以下文章
已经有一个打开的 DataReader 与此命令关联,必须先关闭
已经有一个打开的 DataReader 与此命令关联,必须先关闭
已经有一个与此命令关联的打开的 DataReader 必须首先关闭 linq [重复]
调用另一个 repo 时出错 - '已经有一个打开的 DataReader 与此命令关联,必须先关闭'