1. ホーム

C# データベース操作エラー この接続に関連する開いているデータリーダーがすでにあり、閉じる必要があります。

2022-02-17 05:07:15

データベース保存を行う際、エラーが発生しました: "MySqlException" of type "MySql.Data.MySqlClient" が MySql.Data.dll で発生しましたが、ユーザー コードでは処理されませんでした。

追加情報です。この接続に関連付けられた開いている DataReader がすでにあり、最初にそれを閉じる必要があります。

1. 主な理由は、DataReader が使用するために開かれているとき、SqlConnection は 1 つの DataReader しか開くことができず、別の DataReader を開くときは、前のものを先に閉じなければならないからです。
2、データベースの更新や挿入を行う場合、通常SqlCommandのExecuteNonQuery()メソッドを使用しますが、その前提として、パブリックデータベース接続を定義します(クエリごとに新しい接続を生成すれば、この問題はありませんが、データベースが比較的高いリソースを占有してしまうことになります)。ExecuteNonQuery()の後、内部で空のDataReaderオブジェクトが生成され、現在のデータベース接続が閉じられると、DataReaderは解放されます。したがって、update メソッドを使用する場合は、using キーワードを、そのスコープ内のすべてのオブジェクトを解放するステートメントとして使用することをお勧めします。

コード例です。

 MySqlConnection con = null;

 if (con == null)
            {
                con = new MySqlConnection("Server=localhost;User ID=root;Password=root;Database=vs2015test");
            }
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            using (MySqlCommand cmd = new MySqlCommand(insert, con))
            {
                cmd.Parameters.Add("@Temperature", MySqlDbType.Double,5).Value = Temp;
                cmd.ExecuteNonQuery();
            }
 
            if (con ! = null || con.State == ConnectionState.Open)
            {
                con.Close();
            }