Получение 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();