2016-10-28 4 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; 
} 

이 줄에서는 예외가 발생합니다.Count가 0 인이 OracleParameterCollection에 대해 유효하지 않은 인덱스 0

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

누구에게 무슨 문제가 있는지 알고 있나요? 거래없이 잘 작동했습니다. 이 메소드는 트랜잭션을 추가 한 직후에 오류가 발생하기 시작했습니다.

내장 된 Oracle oracle 클라이언트 라이브러리를 사용하고 있습니다.

using System.Data.OracleClient; 
+0

매개 변수를 추가하지 않은 상태에서 액세스하려고합니다. 인덱스 0이 첫 번째 요소입니다. 매개 변수가없는 빈 매개 변수 컬렉션 –

+0

이것은 프로 시저 CHCCC_STSS (PSSS IN VARCHAR2, PCCC IN VARCHAR2, varReturnValue OUT VARCHAR2)를 호출하는 절차입니다. 그리고 나는 그 매개 변수에 적절한 값을 전달하고있다. –

+0

매개 변수, 특히 매개 변수를 사용하는 방법에 대한 ADO.NET 튜토리얼을 확인하십시오. –

답변

0

objOraCommand.Parameters[i].Value = xxxx 대신에 objOraCommand.Parameters.Add()을 사용하십시오. parameterValuesOracleParameter 유형이어야합니다. 이것을 더 확인하십시오 page

+0

프로 시저 CHCCC_STSS (PSSS에서 VARCHAR2, PCCC에서 VARCHAR2, varReturnValue OUT VARCHAR2); ORA-06550 : 줄 1, 열 7 : PLS-00306은 : 잘못된 번호 또는 'CHCCC_STSS' ORA-06550에 대한 호출에서 인수 유형 : 줄 1, 열 7 : PL/SQL : 문이는이다 무시 내가 가진 오류. –

0

기본적으로 매개 변수에는 매개 변수가 없으므로 색인에 액세스하려고합니다. 따라서 그 오류가 발생합니다. o bjOraCommand.Parameters.Add()과 같은 매개 변수를 추가해야하며 objOraCommand.Parameters[i].Value에있는 값에 액세스하고 목록 및 배열에서와 같이 해당 위치에 매개 변수를 추가하려고합니다. 이 오류는 전혀 Transaction과 관련이 없으며,이 복잡한 코드가 아니라 Transaction을 올바르게 사용하는 것이 좋습니다.

관련 문제