2016-03-29 32 views
5

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.

enter image description here

EDIT Informacje dodatkowe: enter image description here

Odpowiedz

9

trzeba wyrzucać NpgsqlDataReader, który otrzymasz w pierwszym ExecuteRe wywołanie ader, zawiń je za pomocą instrukcji using, tak jak robisz to za pomocą NpgsqlCommand.

+0

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. –

+0

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ń. –

+0

Dzięki. Teraz działa jako urok. –