2013-02-12 15 views
5

Sto chiamando questo proc in C# da Oracle. Ho fatto il proc per restituire un errore. In altre parole, proc fallisce e pv_error viene popolato con una stringa e il rollback viene attivato, ma non funziona. Non sono sicuro del perché. Quindi, cosa sto sbagliando? Grazie in anticipo.Transazioni Oracle di commit e rollback

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. La stored procedure non sta commettendo
  2. sviluppatori
  3. Oracle SQL autocommit è disattivata
  4. Quando eseguo la stored procedure in sviluppatori Oracle SQL funziona (viene a mancare - come ho fatto e doesn' t commit)
  5. solo quando si esegue la stored procedure in VS2005 proc non riesce, fa scattare il rollback, ma non eseguirlo
+1

_Sempre un suggerimento_: Rendi i tuoi metodi più leggibili! –

+0

Che cosa non funziona? Forse è perché non stai eliminando la transazione. Usa una dichiarazione using per assicurarti che venga eliminata. http://msdn.microsoft.com/en-us/library/yh598w02.aspx –

+0

Il rollback non funziona. Esegue comunque la procedura e la impegna anche se attiva il rollback –

risposta

1

Come ho postato nel commento, consiglio vivamente di verificare la proprietà Autocommit della connessione.

la documentazione di Oracle afferma

Questa proprietà determina se Commit si chiama per l'attuale transazione dopo l'esecuzione di ogni istruzione SQL; altrimenti, false. Il valore predefinito è true.

Così almeno provare

conn.Autocommit=false; 
+0

Sì, grazie. Ho provato questo e un paio di altre possibilità. Sfortunatamente non funziona, ma ho chiesto supporto Devart/forum. Pubblicheremo la loro risposta qui quando l'avrò. –

+3

Questo probabilmente si riferisce al 'System.Data.OracleClient' di Microsoft, non Oracle' Oracle.DataAccess.Client' – Roland

7

Molto probabilmente è necessario aggiungere:

cmd.Transaction = tran; 

dopo aver chiamato BeginTransaction.

Senza questo il runtime non sa che cmd è parte della transazione tran!

Per dettagli, vedere the documentation.

+0

Non ha funzionato per me :-(Ma anche senza questo, 'cmd' e' tran' già conoscono l'un l'altro perché 'tran = conn.BeginTransaction()' e 'cmd = new OracleCommand (... sql ..., conn)' – Roland

Problemi correlati