次のスニペットを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で発生しました
追加情報:操作はすでに進行中です。
最初のExecuteReader呼び出しで取得したNpgsqlDataReaderを破棄する必要があります。NpgsqlCommandの場合と同じように、usingステートメントでラップします。
NpgsqlDataReaderを破棄しても、接続は閉じられません。接続を破棄するだけで閉じられます。オープンリーダーは、現在実行中のオープンコマンドに対応しており、新しいコマンドを実行する前に閉じる必要があります。アトミック性については、いくつかのコマンドを含むトランザクションを開始するだけです。