C# 正在获取System.InvalidOperationException错误,我对如何修复该错误感到困惑?

C# 正在获取System.InvalidOperationException错误,我对如何修复该错误感到困惑?,c#,sql,ado.net,ctree,C#,Sql,Ado.net,Ctree,好吧,我正在写的脚本中有一部分,如果它已经在一个表中,它将插入新地址,但问题是我遇到了一个异常,我似乎无法修复,我调试了很多次,它说 System.InvalidOperationException:'已经有一个与此连接关联的打开的DataReader,必须先关闭它。' 我已经在谷歌上搜索过了,但没有什么真正的帮助,所以这里是给出错误的代码块 try { _conn.Open(); string compare = "SELECT addres

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

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

我已经在谷歌上搜索过了,但没有什么真正的帮助,所以这里是给出错误的代码块

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

如果使用连接打开了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();

删除ExecuteScalar调用。你不需要它。如果行数为零,则whilereader.Read立即返回false,您将永远不会输入循环。是的,但不再使用计数。当然,您可以用ifreader.HasRows替换ifcount>0,然后继续使用else消息。看起来您正在使用全局/共享连接。由于该DataReader在使用完毕后未关闭或释放,因此可能还有其他原因可以解释此错误。我在哪里可以阅读reader.hasRows?因为我从来都不知道,如果我要修改代码,我实际上会得到一个指向reader objectNevermind的错误,这是我修改过的东西,但这确实有效,谢谢!