正在获取System.InvalidOperationException错误,我很困惑该如何解决?

时间:2018-08-07 17:40:27

标签: c# sql ado.net ctree

好吧,所以我有一部分正在编写的脚本,如果它已经在一个表中,它将插入新地址,但是问题是我遇到了一个我似乎无法解决的异常,我调试了很多次,并说

  

System.InvalidOperationException:'已经有一个与此Connection关联的打开的DataReader,必须先关闭它。'

我在Google上搜索过,没有什么真正的帮助,因此这是给我错误的代码块

 try
 {
      _conn.Open();
      string compare = 
           "SELECT address, COUNT(*) FROM melena_edws m " + 
           "WHERE EXISTS (SELECT address FROM actuals a WHERE m.address = a.address) " + 
           "GROUP BY address ";

      CtreeSqlCommand cmd = new CtreeSqlCommand(compare, _conn);

      CtreeSqlDataReader reader = cmd.ExecuteReader();
      int count = (int)cmd.ExecuteScalar();//<------Error is here
      if(count > 0)
      {
           while (reader.Read())
           {
                Console.WriteLine(string.Format("{0,12}", reader["address"]));
                //cmd2.ExecuteNonQuery();
                reader.Close();
                Compare($"{reader["address"]} ");    
           }

           reader.Dispose();
           _conn.Close();
      }
      else
      {
            Console.WriteLine("Address already within table");
      }    
 }
 catch (CtreeSqlException ctsqlEx)
 {
       Console.WriteLine(ctsqlEx + " error running command script ");
 }    

1 个答案:

答案 0 :(得分:0)

如果使用该连接打开了DataReader,则该连接对象不能用于其他命令。替代方法是使用不同的连接,但是在您的上下文中,您实际上不需要执行任何操作即可对sql文本返回的记录进行计数。

如果没有行,则DataReader.Read将立即返回false。或者,您可以仅使用DataReader.HasRows属性来发现此事实,而无需进入循环并显示正确的错误消息。

因此您可以使用

重写代码
for col in table.columns:
    for cell in col.cells:
        for par in cell.paragraphs:
            par.style = 'My Center Aligned Style'