2016-03-29 19 views
5

Tôi đang cố chạy đoạn mã sau trong C# Winforms. Đoạn mã này hoạt động tốt với bộ điều hợp pgsql 2.2.6. Điều chỉnh nào có thể được thực hiện để làm việc tốt với pgsql3.0.5 adapter? Cảm ơn.Lỗi C# Winforms Npgsql 3.0.5 "Đã xảy ra sự cố trong khi đang cố chạy nhiều lệnh trong cùng một kết nối

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

Vì vậy, tại tuyên bố Lệnh thứ hai nó mang lại cho tôi những lỗi sau:

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 Thông tin thêm: enter image description here

Trả lời

9

Bạn cần phải vứt bỏ NpgsqlDataReader mà bạn nhận được trong ExecuteRe đầu tiên ader gọi, bọc nó với một tuyên bố bằng cách sử dụng giống như bạn làm với NpgsqlCommand của bạn.

+0

Gỡ bỏ NpgsqlDataReader sẽ đóng kết nối, vì vậy sau khi đọc một số dữ liệu tôi cần mở lại? Phải là nguyên tử, cô lập mỗi câu lệnh sql theo phương pháp khác nhau? Cảm ơn. –

+0

Gỡ bỏ NpgsqlDataReader không đóng kết nối - chỉ xử lý kết nối thực hiện điều đó. Một trình đọc mở tương ứng với một lệnh đang chạy, mà bạn phải đóng trước khi thực hiện một lệnh mới. Đối với atomicity chỉ bắt đầu một giao dịch bao gồm một số lệnh. –

+0

Cảm ơn. Bây giờ làm việc như một say mê. –

Các vấn đề liên quan