MySQL ExecuteNonQuery выдает «Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым» Исключение

0

У меня есть несколько процессов, вставляющих данные в ту же таблицу в моей базе данных. Я использую одно соединение с базой данных для всех процессов. Когда я пытался запустить один из sqlcommand, я получил вышеупомянутое исключение. Я провел некоторое исследование в Интернете, и кажется, что сервер Mysql поддерживает только один datareader для каждого соединения. И поскольку каждый процесс использует executeNonQuery для быстрого выполнения команд SQL, возможно, что предыдущий datareader не был закрыт при выдаче новых команд.

Есть ли способ решить эту проблему?

Спасибо

Теги:

1 ответ

2

Основной причиной вашей ошибки является то, что (надеясь избежать очевидного), используется то же соединение и уже открыто/выполняется. Являются ли они static на данный момент? Предложите посмотреть, почему объединение не используется или ограничено.

Считайте рефакторинг кода, чтобы иметь using. Pseudo, noncompiling example:

private void ExecNonQuery(string sqlStatement)
{          
    using (var conn = new MySqlConnection(connString))
    {
       using (var cmd = new MySqlDataCommand(conn))
       {
           cmd.ExecuteNonQuery(sqlStatement);
       }
    }
}

или

private List<Customer> GetCustomers( )
{
    string sqlStatement = "SELECT ID, Name FROM Customer";                
    using (var conn = new MySqlConnection(connString))
    {
        using (var cmd = new MySqlDataCommand(conn))
        {
           //get a reader and do something
           using (var reader = new MySqlDataReader(sqlStatement))
           { 
               ...
           }
        }
    }
}

Завершая создание этих объектов в операторе using, вы убедитесь, что ваши объекты закрыты и удалены надлежащим образом.

Я бы предположил, что да, вы должны открывать новое соединение каждый раз. ADO.NET Драйвер для MySQL должен использовать правильный пул соединений. Вы действительно не должны думать об этом.

Почему несколько процессов используют одно и то же соединение? Что там нужно?

  • 0
    Требуется ли для этого открывать новое соединение каждый раз, когда я пытаюсь запустить команду sql? У меня есть несколько процессов, использующих одно и то же соединение. Благодарю.
  • 0
    каждый процесс получает данные из интерфейсов сокетов и сохраняет их в базе данных. Иногда данные поступают из интерфейса сокетов с очень высокой скоростью.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню