web-dev-qa-db-ja.com

同じ接続内で複数のコマンドを実行しようとすると、C#Winforms Npgsql3.0.5「操作はすでに進行中です」エラーが発生します

次のスニペットをC#Winformsで実行しようとしています。このコードは、pgsql2.2.6アダプタでうまく機能しています。 pgsql3.0.5アダプターで正常に動作するためにどのような修正を行うことができますか?ありがとう。

NpgsqlConnection conn = new NpgsqlConnection(MainForm2.MyConString);
        {
            conn.Open();
            using (NpgsqlCommand cmd = new NpgsqlCommand("SELECT rfid,name,sc_id from passenger ORDER by name", conn))
            {
                NpgsqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    var obj = new PassengerClass
                    {
                        RFID = dr.GetString(0),
                        Name = dr.GetString(1),
                        sc_id = dr.GetInt32(2)
                    };
                    s = dr.GetString(0);
                    try { ret.Add(s, obj); }
                    catch (Exception ex) { SM.Debug("Fail to add RFID Name in hash RFID:" + s + ex.ToString()); }
                }
            }
            MainForm2.PassHash = ret;
            try
            {
                using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format("UPDATE place set useridx ={0} where useridx=0", MainForm2.userIDX), conn))
                    cmd.ExecuteNonQuery();

                using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format("UPDATE zonename set useridx ={0} where useridx=0", MainForm2.userIDX), conn))
                    cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                SM.Debug("Error on update users IDX for place and zone with value 0 :" + ex.ToString());
            }

したがって、2番目のコマンドステートメントで、次のエラーが発生します。

タイプ 'System.InvalidOperationException'の最初のチャンスの例外がNpgsql.dllで発生しました

追加情報:操作はすでに進行中です。

enter image description here

[〜#〜]編集[〜#〜]追加情報: enter image description here

9

最初のExecuteReader呼び出しで取得したNpgsqlDataReaderを破棄する必要があります。NpgsqlCommandの場合と同じように、usingステートメントでラップします。

NpgsqlDataReaderを破棄しても、接続は閉じられません。接続を破棄するだけで閉じられます。オープンリーダーは、現在実行中のオープンコマンドに対応しており、新しいコマンドを実行する前に閉じる必要があります。アトミック性については、いくつかのコマンドを含むトランザクションを開始するだけです。

15
Shay Rojansky