2013-02-12 3 views
5

Я вызываю этот proc в C# из oracle. Я заставил proc вернуть ошибку. Другими словами, proc терпит неудачу, и pv_error заполняется строкой, и откат запускается, но не работает. Я не знаю, почему. Итак, что я делаю неправильно? Заранее спасибо.Commit and rollback Операции 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. разработчиков
  3. Oracle SQL автокоммит отключена
  4. Когда я запустить хранимую процедуру разработчиков Oracle SQL работает (сбой - как я сделал это и Безразлично» т фиксации)
  5. только при выполнении хранимой процедуры в VS2005 процедурный объект не удается, вызывает откат, но не выполняет его
+1

_Просто подсказка: сделайте ваши методы более читабельными! –

+0

Что не работает? Возможно, это потому, что вы не распоряжаетесь транзакцией. Используйте инструкцию using, чтобы убедиться, что она удалена. http://msdn.microsoft.com/en-us/library/yh598w02.aspx –

+0

Откат не работает. Он по-прежнему выполняет эту процедуру и совершает ее, даже если она вызывает Откат –

ответ

1

Как я писал в комментарии, я настоятельно рекомендую проверить свойство Autocommit подключения.

В документации Oracle утверждает

Это свойство определяет, если Commit вызываются для текущей сделки после выполнения каждого оператора SQL; в противном случае false. Значение по умолчанию - true.

Так, по крайней мере попробовать

conn.Autocommit=false; 
+0

Да, спасибо. Я попробовал это и пару других возможностей. К сожалению, это не сработало, но я попросил поддержку/форум Devart. Выложите их ответ здесь, когда я его получу. –

+3

Это, вероятно, связано с «System.Data.OracleClient», а не с Oracle «Oracle.DataAccess.Client» – Roland

7

Скорее всего, вам нужно добавить:

cmd.Transaction = tran; 

после вызова BeginTransaction.

Без этого время выполнения не знает, что cmd является частью транзакции tran!

Подробнее см. the documentation.

+0

Не работает для меня :-(Но даже без этого 'cmd' и' tran' уже знают друг о друге потому что 'tran = conn.BeginTransaction()' и 'cmd = new OracleCommand (... sql ..., conn)' – Roland

Смежные вопросы