2015-11-11 105 views
0

我有一个问题。你能告诉我这段代码有什么问题吗?所以情况看起来像这样:程序向我显示了这个错误,但并非每次都有。有时它确实显示了它没有。已经有一个打开的DataReader与这个Command关联,必须先关闭

错误:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll

Additional information: There is already an open DataReader associated with this Command which must be closed first.

代码:

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()“)并且它回滚了。顺便说一句。对不起我的英语:<

+0

凡'newConnection'定义对象的方法发生异常叫什么名字?它可能被定义在其他地方,你没有关闭 –

+0

'newConnecting'是全球性的tis文件,我使用了这3次,每次我关闭它。 – Recovery

回答

1

使用本地SqlDataReader实例为您的方法。另外,如果使用使用块,它将负责调用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语句确保处置是即使当你调用

+0

我在这'使用(var cmd = new SqlCommand(c,“SELECT * FROM ITEMS”))''不能转换为字符串 和btw在'var connStr =“YourConnectionStringHere”'我必须使用@工作吗?因为它我可以连接到我的sqlServer没有我有下一个错误 – Recovery

+0

@Recovery命令是错误的。检查udpated的答案。 – Shyju

+0

现在它的工作很棒:>谢谢^^ – Recovery

相关问题