2013-02-12 44 views
5

Tôi đang gọi proc này bằng C# từ oracle. Tôi đã làm cho proc trả lại một lỗi. Nói cách khác, proc thất bại và pv_error được điền bằng chuỗi và rollback được kích hoạt, nhưng không hoạt động. Tôi cung không chăc tại sao. Vì vậy, tôi đang làm gì sai? Cảm ơn trước.Cam kết và khôi phục các giao dịch Oracle

private void hhrcv_update_dc_grs_carton() 
    { 
     OracleCommand cmd = new OracleCommand(); 
     cmd.Connection = conn; 
     conn.Open(); 
     OracleTransaction trans = conn.BeginTransaction(); 
     cmd.CommandTimeout = 0; 
     cmd.CommandText = "dc.hhrcv_update_dc_grs_carton"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("pn_dc_grs_no", OracleDbType.Number).Value = txtDcGRSNo.Text; 
     cmd.Parameters.Add("pn_pallet_id_no", OracleDbType.Number).Value = txtPalletId.Text; 
     cmd.Parameters.Add("pn_carton_code", OracleDbType.VarChar).Value = txtCartonCode.Text; 
     cmd.Parameters.Add("pn_company_id_no", OracleDbType.Number).Value = Companyid; 
     cmd.Parameters.Add("pn_order_no", OracleDbType.Number).Value = txtOrderno.Text; 
     cmd.Parameters.Add("pn_emp_id_no", OracleDbType.Number).Value = empid; 
     cmd.Parameters.Add(new OracleParameter("pv_error", OracleDbType.VarChar)); 
     cmd.Parameters["pv_error"].Direction = ParameterDirection.Output; 
     string pv_error; 
     cmd.ExecuteNonQuery(); 
     pv_error = cmd.Parameters["pv_error"].Value.ToString(); 

     if (pv_error.ToString() == "") 
     { 
      trans.Commit(); 
     } 
     else 
     { 
      trans.Rollback(); 
      MessageBox.Show("" + pv_error, "Error"); 
      frmReturns r = new frmReturns(); 
      r.Show(); 
      this.Hide(); 
     } 
    } 
  1. Thủ tục lưu trữ được không cam
  2. phát triển
  3. Oracle SQL autocommit bị vô hiệu hóa
  4. Khi tôi chạy các thủ tục lưu trữ trong các nhà phát triển Oracle SQL nó hoạt động (thất bại - như tôi đã làm cho nó và doesn' t cam)
  5. Chỉ khi chạy thủ tục lưu trữ trong VS2005 proc thất bại, gây nên các rollback nhưng không thực hiện nó
+1

_Chỉ mẹo: Làm cho các phương pháp của bạn dễ đọc hơn! –

+0

Điều gì không hiệu quả? Có thể vì bạn không xử lý giao dịch. Sử dụng một tuyên bố sử dụng để đảm bảo nó được xử lý. http://msdn.microsoft.com/en-us/library/yh598w02.aspx –

+0

Việc khôi phục không hoạt động. Nó vẫn thực hiện các thủ tục và cam kết nó mặc dù nó gây ra các Rollback –

Trả lời

1

Như tôi đã đăng trong bình luận, tôi Highly reccommend kiểm tra tài sản Autocommit của kết nối.

Như tài liệu của Oracle khẳng định

Thuộc tính này xác định nếu Commit được gọi cho giao dịch vãng lai sau khi thực hiện từng câu lệnh SQL; nếu không, sai. Giá trị mặc định là đúng.

Vì vậy, ít nhất là cố

conn.Autocommit=false; 
+0

Có cảm ơn. Tôi đã thử điều đó và một vài khả năng khác. Thật không may nó không hoạt động nhưng tôi đã yêu cầu hỗ trợ/diễn đàn Devart. Sẽ đăng câu trả lời của họ ở đây khi tôi nhận được nó. –

+3

Điều này có thể liên quan đến 'System.Data.OracleClient' của Microsoft, không phải Oracle 'Oracle.DataAccess.Client' – Roland

7

Nhiều khả năng bạn cần phải thêm:

cmd.Transaction = tran; 

sau khi gọi BeginTransaction.

Nếu không có thời gian chạy này không biết rằng cmd là một phần của giao dịch tran!

Để biết chi tiết, xem the documentation.

+0

Không hoạt động với tôi :-(Nhưng ngay cả khi không có điều này,' cmd' và 'tran' đã biết về nhau vì 'tran = conn.BeginTransaction()' và 'cmd = new OracleCommand (... sql ..., conn)' – Roland

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