2016-10-28 2 views
0
public void BeginTransaction() 
{ 
    try 
    { 
     this._keepalive = true; 
     if (_oracleConnection.State != ConnectionState.Open) 
      _oracleConnection.Open(); 
      //_oracleConnection.Autocommit = false; 
     this._transaction = this._oracleConnection.BeginTransaction(IsolationLevel.ReadCommitted); 
    } 
    catch (Exception ex) 
    { 
     _hasError = true; 
     _ErrorMessage = ex.Message + "::" + ex.StackTrace; 
    } 
} 

public void CommitTransaction() 
{ 
    try 
    { 
     this._transaction.Commit(); 
     this._keepalive = false; 
    } 
    catch (Exception ex) 
    { 
     _hasError = true; 
     _ErrorMessage = ex.Message + "::" + ex.StackTrace; 
    } 
} 

public void RollbackTransaction() 
{ 
    try 
    { 
     this._transaction.Rollback(); 
     this._keepalive = false; 
    } 
    catch (Exception ex) 
    { 
     _hasError = true; 
     _ErrorMessage = ex.Message + "::" + ex.StackTrace; 
    } 
} 

public string ExecuteSPNonQuerySingleReturnValue(string storedProcName, object[] parameterValues, string outParameterName, bool useTransaction = false) 
{ 
    _hasError = false; _ErrorMessage = ""; 
    string result = ""; 
    try 
    { 
     if (_oracleConnection.State == ConnectionState.Closed) 
      _oracleConnection.Open(); 
     if (_oracleConnection.State == ConnectionState.Open) 
     { 
      OracleCommand objOraCommand = new OracleCommand(); 
      objOraCommand.Connection = _oracleConnection; 
      objOraCommand.CommandText = storedProcName; 
      objOraCommand.CommandType = CommandType.StoredProcedure; 
      if (useTransaction == true) 
       objOraCommand.Transaction = this._transaction; 
      OracleCommandBuilder.DeriveParameters(objOraCommand); 
      for (int i = 0; i < parameterValues.Length; i++) 
      { 
       //objOraCommand.Parameters.Add(new OracleParameter(parameterNames[i], OracleType.VarChar)).Value = (parameterValues[i] == null) ? DBNull.Value : parameterValues[i]; 
       // It threw exception over here. Below this line. 
       objOraCommand.Parameters[i].Value = (parameterValues[i] == null) ? DBNull.Value : parameterValues[i]; 
       //objOraCommand.Parameters.AddWithValue(parameterNames[i], (parameterValues[i] == null) ? DBNull.Value : parameterValues[i]); 
      } 
      objOraCommand.ExecuteNonQuery(); 
      result = objOraCommand.Parameters[outParameterName].Value.ToString(); 
     } 
    } 
    catch (Exception ex) 
    { 
     _hasError = true; 
     _ErrorMessage = ex.Message; 
    } 
    finally 
    { 
     if (_oracleConnection.State == ConnectionState.Open && _keepalive == false) 
     _oracleConnection.Close(); 
    } 
    return result; 
} 

Ich erhalte eine Ausnahme bei dieser Zeile.Ungültiger Index 0 für diese OracleParameterCollection mit Count = 0

objOraCommand.Parameters[i].Value = (parameterValues[i] == null) ? DBNull.Value : parameterValues[i]; 

Weiß jemand, was ist das Problem? Es funktionierte gut ohne Transaktion. Bei dieser Methode wurde sofort nach dem Hinzufügen der Transaktion ein Fehler angezeigt.

Ich verwende integrierte .Net Oracle-Client-Bibliothek.

using System.Data.OracleClient; 
+0

Sie haben noch keine Parameter hinzugefügt, aber Sie versuchen, auf sie zuzugreifen. Index 0 ist das erste Element. Eine leere Parametersammlung hat jedoch keine Parameter –

+0

Dies ist die Prozedur, die ich anrufe PROCEDURE CHCCC_STSS (PSSSS IN VARCHAR2, PCCC IN VARCHAR2, varReturnValue OUT VARCHAR2); und ich übergebe diesen Parametern die richtigen Werte. –

+0

Überprüfen Sie jedes ADO.NET-Tutorial zur Verwendung von Parametern, insbesondere von out-Parametern. –

Antwort

0

mit objOraCommand.Parameters.Add() statt objOraCommand.Parameters[i].Value = xxxx. Und parameterValues sollte OracleParameter Typ sein. mehr überprüfen Sie dies page

+0

VERFAHREN CHCCC_STSS (PSSS IN VARCHAR2, PCCC IN VARCHAR2, varReturnValue OUT VARCHAR2); ORA-06550: Zeile 1, Spalte 7: PLS-00306: falsche Anzahl oder Arten von Argumenten in Aufruf von 'CHCCC_STSS' ORA-06550: Zeile 1, Spalte 7: PL/SQL: Statement ignorieren Dies ist das ist Fehler, den ich bekam. –

0

Grundsätzlich gibt es keinen Parameter in Parameter und Sie versuchen, auf seinen Index zuzugreifen, deshalb gibt es Fehler geben. Sie sollten Parameter wie o bjOraCommand.Parameters.Add() hinzufügen und versuchen, auf den Wert unter objOraCommand.Parameters[i].Value zuzugreifen und zuerst den Parameter wie in der Liste und im Array zu dieser Position hinzuzufügen. und dieser Fehler betrifft Transaction überhaupt nicht, mein einziger Rat wäre, Transaction richtig zu benutzen, nicht wie dieser komplizierte Code.

Verwandte Themen