已经有一个打开的 DataReader 与此命令关联,必须先关闭
Posted
技术标签:
【中文标题】已经有一个打开的 DataReader 与此命令关联,必须先关闭【英文标题】:There is already an open DataReader associated with this Command which must be closed first 【发布时间】:2015-11-11 23:58:12 【问题描述】:我有一个问题。你能告诉我这段代码有什么问题吗?所以案例看起来像这样:程序向我显示这个错误,但不是每次都显示。有时它确实显示它,有时它没有。
错误:
System.Data.dll 中出现“System.InvalidOperationException”类型的未处理异常
附加信息:。
代码:
private void loadlist()
ItemList.Items.Clear();
NumberList.Items.Clear();
newConnection.connection();
cmd.CommandText = "select * from Items";
dr = cmd.ExecuteReader();
if (dr.HasRows)
while (dr.Read())
ItemList.Items.Add(dr[0].ToString());
NumberList.Items.Add(dr[1].ToString());
dr.Close();
newConnection.cnOff();
我可以删除“dr.Close()”并且它起作用了,在我尝试运行之后,我必须编辑一些代码(写回“dr.Close()”)并且它起作用了。顺便提一句。对不起我的英语:
【问题讨论】:
newConnection
在哪里定义?它可能被定义在你没有关闭的其他地方
'newConnecting' 在 tis 文件中是全局的,我使用了 3 次,每次都关闭它。
【参考方案1】:
为您的方法使用本地 SqlDataReader
实例。另外,如果你使用 using 块,它会负责调用Dispose
方法并清理内存。
using(SqlDataReader dr= cmd.ExecuteReader())
while (dr.Read())
//read from reader now
ItemList.Items.Add(dr[0].ToString());
您也可以在连接和命令对象上使用 using 块。
var connStr = "ReplaceYourConnectionStringHere"
using (var c = new SqlConnection(connStr))
using (var cmd = new SqlCommand("SELECT * FROM ITEMS",c))
c.Open();
using (var dr = cmd.ExecuteReader())
while (dr.Read())
//read from reader now
//ItemList.Items.Add(dr[0].ToString());
//No need to explicitly close connection :) Thanks to "using"
using 语句可确保调用 Dispose,即使在您调用对象上的方法时发生异常也是如此
【讨论】:
我在这个using (var cmd = new SqlCommand(c, "SELECT * FROM ITEMS"))
中有错误,不能转换为字符串,顺便说一句,var connStr = "YourConnectionStringHere"
我必须使用@ 才能工作?因为有了它,我可以连接到我的 sqlServer 而不会出现下一个错误
@Recovery 顺序错误。检查更新的答案。以上是关于已经有一个打开的 DataReader 与此命令关联,必须先关闭的主要内容,如果未能解决你的问题,请参考以下文章
已经有一个打开的 DataReader 与此命令关联,必须先关闭
已经有一个与此命令关联的打开的 DataReader 必须首先关闭 linq [重复]
调用另一个 repo 时出错 - '已经有一个打开的 DataReader 与此命令关联,必须先关闭'
已经有一个打开的 DataReader 与此命令关联,必须先关闭