Próbuję uruchomić poniższy fragment w C# WinForm. Ten fragment kodu działa dobrze z adapterem pgsql 2.2.6. Jaką poprawkę można wprowadzić, aby działać poprawnie z adapterem pgsql3.0.5? Dzięki.C# Winforms Npgsql 3.0.5 "Operacja już w toku" błąd podczas próby uruchomienia wielu poleceń w tym samym połączeniu
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());
}
Tak, na drugim rachunku poleceń daje mi następujący błąd:
A first chance exception of type 'System.InvalidOperationException' occurred in Npgsql.dll
Additional information: An operation is already in progress.
Utylizacja NpgsqlDataReader spowoduje zamknięcie połączenia, więc po przeczytaniu niektórych danych muszę je ponownie otworzyć? Musi być atomowość, izolowanie każdego wyrażenia sql w inny sposób? Dzięki. –
Utylizacja NpgsqlDataReader nie zamyka połączenia - tylko wyładowywanie połączenia powoduje to. Otwarty czytnik odpowiada aktualnie uruchomionemu poleceniu open, które należy zamknąć przed wykonaniem nowego polecenia. Dla atomowości wystarczy rozpocząć transakcję, która obejmuje kilka poleceń. –
Dzięki. Teraz działa jako urok. –