-2

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

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

我用谷歌搜索并没有真正帮助所以这里是给我错误的代码块

 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 ");
 }    
4

1 回答 1

0

如果您使用该连接打开了 DataReader,则连接对象不能用于另一个命令。另一种方法是使用不同的连接,但在您的上下文中,您实际上不需要做任何事情来计算 sql 文本返回的记录。

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

所以你可以重写你的代码

_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()
if(reader.HasRows)
{
    while (reader.Read())
    {
        Console.WriteLine(string.Format("{0,12}", reader["address"]));
        Compare($"{reader["address"]} ");
    }
}
else
{
    // Display your message
}

reader.Dispose();
_conn.Close();
于 2018-08-07T17:54:12.133 回答