Получение System.InvalidOperationException Ошибка, которую я не понимаю, как это исправить?

Итак, у меня есть часть сценария, который я пишу, который будет вставлять новые адреса, если он уже находится в одной таблице, но проблема в том, что я получаю исключение, которое не могу исправить, я много раз отлаживал, и он говорит

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

1 ответ

Объект соединения не может использоваться для другой команды, если у вас есть 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();
Другие вопросы по тегам