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; 
} 

Je reçois une exception à cette ligne.Index 0 invalide pour OracleParameterCollection avec Count = 0

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

Est-ce que quelqu'un sait quel est le problème? Cela fonctionnait bien sans transaction. Cette méthode a commencé à donner une erreur juste après l'ajout d'une transaction. J'utilise une bibliothèque client .Net Oracle.

using System.Data.OracleClient; 
+0

Vous n'avez ajouté aucun paramètre mais vous essayez d'y accéder. L'index 0 est le premier élément. Une collection de paramètres vide n'a cependant aucun paramètre –

+0

C'est la procédure que j'appelle PROCEDURE CHCCC_STSS (PSSS IN VARCHAR2, PCCC IN VARCHAR2, varReturnValue OUT VARCHAR2); et je passe des valeurs appropriées à ces paramètres. –

+0

S'il vous plaît vérifier tout tutoriel ADO.NET sur la façon d'utiliser les paramètres, spécialement sur les paramètres. –

Répondre

0

à l'aide objOraCommand.Parameters.Add() au lieu de objOraCommand.Parameters[i].Value = xxxx. Et parameterValues devrait être de type OracleParameter. more check this page

+0

PROCÉDURE CHCCC_STSS (PSSS DANS VARCHAR2, PCCC DANS VARCHAR2, varReturnValue OUT VARCHAR2); ORA-06550: ligne 1, colonne 7: PLS-00306: mauvais numéro ou types d'arguments en appel à 'CHCCC_STSS' ORA-06550: ligne 1, colonne 7: PL/SQL: Déclaration ignorée Ceci est la erreur que j'ai eu. –

0

Fondamentalement, il n'y a pas de paramètre dans les paramètres et vous essayez d'accéder à son index, c'est pourquoi il donne une erreur. vous devez ajouter un paramètre comme o bjOraCommand.Parameters.Add() et vous voulez essayer d'accéder à la valeur à objOraCommand.Parameters[i].Value et d'ajouter d'abord le paramètre à cet emplacement comme vous le faites dans la liste et le tableau. et cette erreur n'est pas du tout liée à la transaction, mon seul conseil serait d'utiliser correctement Transaction pas comme ce code compliqué.