С этим соединением уже связан открытый DataReader, который необходимо закрыть при первой ошибке

Я успешно заполнил значения из таблицы MySQL в поле со списком для фильтрации поиска, и оно работает хорошо, за исключением того, что иногда я получаю сообщение об ошибке:

MySql.Data.MySqlClient.MySqlException: «Уже существует открытый DataReader, связанный с этим соединением, который необходимо сначала закрыть».

при изменении входов.

Я использовал метод асинхронной обработки ниже, но все равно получаю эту ошибку.

internal async Task<DataSet> RunQueryWithParamsAsync(string query, MySqlParameter[] parameters)
{
    try
    {
        await OpenDBConnectionAsync();

        using (var command = new MySqlCommand(query, conn))
        {
            command.CommandType = CommandType.Text;

            if (parameters != null && parameters.Length > 0)
            {
                command.Parameters.AddRange(parameters);
            }

            using (var reader = await command.ExecuteReaderAsync())
            {
                var dataSet = new DataSet();
                var dataTable = new DataTable();
                dataTable.Load(reader);
                dataSet.Tables.Add(dataTable);
                reader.Close();
                return dataSet;
            }
        }
    }
    catch (Exception ex)
    {
        // Log the exception or handle it as needed
        throw new Exception("An error occurred while executing the query.", ex);
    }
    finally
    {
        await CloseDBConnectionAsync();
    }
}

Я предполагаю, что у вас есть одно соединение, и оно может использоваться несколькими командами. Вместо этого создавайте новое соединение каждый раз, когда вам нужно взаимодействовать с базой данных, и позвольте базовому пулу соединений обрабатывать любой соответствующий общий доступ. (Разумеется, используйте операторы using соответствующим образом, чтобы было ясно, когда соединение можно использовать повторно.)

Jon Skeet 30.06.2024 09:42

Большое спасибо @Shadow, это была проблема, и я создавал новое соединение каждый раз, когда использую базу данных, и, видимо, все в порядке. еще раз спасибо <3

udd_ish 30.06.2024 11:16

Если вы еще этого не сделали, создайте объект соединения с оператором using. Вы можете изменить свой метод OpenDBConnectionAsync, чтобы каждый раз создавать, открывать и возвращать новый объект соединения, а затем использовать using (var connection = await GetOpenDBConnectionAsync()).

jmcilhinney 30.06.2024 11:28

Кстати, нет смысла создавать DataSet, если вы используете только один DataTable. Возможно, вы используете DataSet вне этого кода, но если нет, просто используйте DataTable отдельно.

jmcilhinney 30.06.2024 11:30

привет @jmcilhinney Спасибо за ваш комментарий. Я обновил код выше. не могли бы вы проверить, все ли в порядке?

udd_ish 30.06.2024 11:45

@udd_ish, не меняй свой вопрос. Добавьте ответ.

jmcilhinney 30.06.2024 11:58

конечно @jmcilhinney, я вернулся к раннему коду в вопросе и опубликовал обновленный код в новом ответе

udd_ish 30.06.2024 12:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обновил код. Согласно предложениям, проблема заключалась в том, что я устанавливал одно соединение и делился им со многими транзакциями. Это вызвало эту ошибку. Я добавил новое соединение внутри блока using, чтобы убедиться, что я создаю новое соединение для каждой транзакции — и всякий раз, когда это делается, оно закрывается из-за блока using, поэтому дальнейшей блокировки не будет. Большое спасибо за предложения.

internal async Task<DataSet> RunQueryAsync(string query)
{
    try
    {
        using (var conn = new MySqlConnection(connectionString))
        {
            await conn.OpenAsync();

            using (var command = new MySqlCommand(query, conn))
            {
                command.CommandType = CommandType.Text;

                using (var reader = await command.ExecuteReaderAsync())
                {
                    var dataSet = new DataSet();
                    var dataTable = new DataTable();
                    dataTable.Load(reader);
                    dataSet.Tables.Add(dataTable);
                    return dataSet;
                }
            }
        }
    }
    catch (Exception ex)
    {
        throw new Exception("An error occurred while executing the query.", ex);
    }
}

Другие вопросы по теме