2016-03-29 17 views
5

Sto provando a eseguire il seguente frammento in C# Winforms. Questo pezzo di codice funziona bene con l'adattatore pgsql 2.2.6. Quale correzione può essere fatta per funzionare correttamente con l'adattatore pgsql3.0.5? Grazie.Errore C# Winforms Npgsql 3.0.5 "Un'operazione già in corso" quando si tenta di eseguire più comandi all'interno della stessa connessione

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()); 
      } 

Così, alla seconda istruzione di comando mi dà il seguente errore:

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 Ulteriori informazioni: enter image description here

risposta

9

È necessario disporre di NpgsqlDataReader che si ottiene nel primo ExecuteRe chiamata ad aderire, avvolgila con una dichiarazione usando proprio come fai con il tuo NpgsqlCommand.

+0

Smaltire NpgsqlDataReader chiuderà la connessione, quindi dopo aver letto alcuni dati ho bisogno di riaprirlo? Deve essere atomicità, isolando ogni istruzione sql in un metodo diverso? Grazie. –

+0

Smaltire NpgsqlDataReader non chiude la connessione - solo lo smaltimento della connessione lo fa. Un lettore aperto corrisponde a un comando aperto attualmente in esecuzione, che è necessario chiudere prima di eseguire un nuovo comando. Per atomicità basta avviare una transazione che comprende diversi comandi. –

+0

Grazie. Ora funziona come un fascino. –

Problemi correlati