我试图打开一个刚刚关闭的mysql连接,这引发了一个完全误导性的异常:“给定的键不存在于字典中”我的代码可以总结如下:
try
{
using var connection = new MySqlConnection(ConnectionString);
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);
using var selectCommand = connection.CreateCommand();
selectCommand.CommandText = "SELECT id FROM `objects.property` WHERE id=@id";
selectCommand.Parameters.AddWithValue("@id", id);
using var reader = await selectCommand.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);
flag = reader.HasRows;
}
catch(Exception ex)
{
// log here
}
// try to reopen to create or update on table based on boolena variable flag
using (var connection = new MySqlConnection(ConnectionString))
{
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);
using var command = connection.CreateCommand();
command.CommandText = "CREATE "; // create or update query here based on boolean variable flag
await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
}
有时会捕获一个错误,当我第一次打开连接时,有时当我重新打开它时,我似乎与 mysql 的连接生命周期有关,但不太明白如何解决这个问题,我还尝试创建一个代码块并不关闭并重新打开连接,但在这种情况下,mysql告诉我该连接已在使用中:“连接已打开错误”。 那么如何解决这个问题呢?我还检查了连接状态是否已打开,然后以类似的方式打开它:
if (connection.State == ConnectionState.Open)
{
// connection opened dont reopen it
}
以前的代码告诉我连接总是关闭的,但我仍然有随机错误,有时工作,有时不工作。 我使用的是 net core 6 和 mysql 连接器 2.2.7,我也已将后者更新到最新的 2.3.0-beta.3 版本,这是目前的最新版本。
您对这一行有一个非常严重的问题:
using var connection = new MySqlConnection(ConnectionString);
这将创建一个新连接,然后立即处置它,因为
using
超出了范围。
您继续使用下面的连接,但它已被处置。
同样,与
using var selectCommand = connection.CreateCommand();
尽管...我很确定这些命令没有或不需要
dispose
,所以我不确定 using
在这里做什么。