Я успешно заполнил значения из таблицы 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();
}
}
Большое спасибо @Shadow, это была проблема, и я создавал новое соединение каждый раз, когда использую базу данных, и, видимо, все в порядке. еще раз спасибо <3
Если вы еще этого не сделали, создайте объект соединения с оператором using
. Вы можете изменить свой метод OpenDBConnectionAsync
, чтобы каждый раз создавать, открывать и возвращать новый объект соединения, а затем использовать using (var connection = await GetOpenDBConnectionAsync())
.
Кстати, нет смысла создавать DataSet
, если вы используете только один DataTable
. Возможно, вы используете DataSet
вне этого кода, но если нет, просто используйте DataTable
отдельно.
привет @jmcilhinney Спасибо за ваш комментарий. Я обновил код выше. не могли бы вы проверить, все ли в порядке?
@udd_ish, не меняй свой вопрос. Добавьте ответ.
конечно @jmcilhinney, я вернулся к раннему коду в вопросе и опубликовал обновленный код в новом ответе
Я обновил код. Согласно предложениям, проблема заключалась в том, что я устанавливал одно соединение и делился им со многими транзакциями. Это вызвало эту ошибку. Я добавил новое соединение внутри блока 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);
}
}
Я предполагаю, что у вас есть одно соединение, и оно может использоваться несколькими командами. Вместо этого создавайте новое соединение каждый раз, когда вам нужно взаимодействовать с базой данных, и позвольте базовому пулу соединений обрабатывать любой соответствующий общий доступ. (Разумеется, используйте операторы
using
соответствующим образом, чтобы было ясно, когда соединение можно использовать повторно.)