2013-02-12 109 views
5

我從oracle調用C#中的此proc。我讓proc返回一個錯誤。換句話說,proc失敗,pv_error被字符串填充,回滾被觸發,但不起作用。我不知道爲什麼。那麼,我做錯了什麼?提前致謝。提交和回滾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. 存儲過程是不是犯
  2. 的Oracle SQL開發人員自動提交被禁用
  3. 當我運行存儲過程中的Oracle SQL開發它的工作原理(失敗 - 就像我已和沒有按」運行存儲過程在VS2005的PROC失敗當T提交)
  4. 只,觸發回退,但不執行它
+1

_Just tip_:讓你的方法更具可讀性! – 2013-02-12 11:39:27

+0

什麼不起作用?也許這是因爲你沒有處理交易。使用using語句來確保它被丟棄。 http://msdn.microsoft.com/en-us/library/yh598w02.aspx – 2013-02-12 11:40:56

+0

回滾不起作用。它仍然執行該過程並提交它,即使它觸發了回滾 – 2013-02-12 11:43:52

回答

1

正如我在評論中發佈的那樣,我高度推薦檢查連接的Autocommit屬性。

Oracle的文件指出

這個屬性決定是否提交被稱爲爲每個SQL語句執行後當前 交易;否則, 錯誤。 默認值爲true。

因此至少嘗試

conn.Autocommit=false; 
+0

是的謝謝。我已經嘗試過以及其他一些可能性。不幸的是它不起作用,但我已經問Devart支持/論壇。當我得到它時,會在這裏發佈他們的答案。 – 2013-02-12 14:23:54

+3

這可能與微軟的'System.Data.OracleClient'有關,而不是Oracle的'Oracle.DataAccess.Client'。 – Roland 2016-01-12 12:19:00

7

最有可能你需要添加:

cmd.Transaction = tran; 

調用BeginTransaction後。

沒有這個運行時並不知道cmd是交易tran的一部分!

詳情請參閱the documentation

+0

對我不起作用:-(但即使沒有這個,'cmd'和'tran'已經知道了彼此因爲'tran = conn.BeginTransaction()'和'cmd = new OracleCommand(... sql ...,conn)' – Roland 2016-01-12 12:13:37