打开mysql连接在net core中抛出异常

问题描述 投票:0回答:1

我试图打开一个刚刚关闭的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 版本,这是目前的最新版本。

mysql .net-core connection-string connection-pooling
1个回答
0
投票

您对这一行有一个非常严重的问题:

  using var connection = new MySqlConnection(ConnectionString);

这将创建一个新连接,然后立即处置它,因为

using
超出了范围。

您继续使用下面的连接,但它已被处置。

同样,与

using var selectCommand = connection.CreateCommand();

尽管...我很确定这些命令没有或不需要

dispose
,所以我不确定
using
在这里做什么。

© www.soinside.com 2019 - 2024. All rights reserved.