2017-10-12 7 views
0

Je fais une application MVC. J'utilise la connexion Oracle Database avec Enterprise Library.Bibliothèque Oracle Enterprise Called procédure stockée avec l'erreur ExecuteSprocAccessor

Le problème que j'ai est de récupérer des données lors de l'utilisation ExecuteSprocAccessor ...

Lorsque j'utilise Linq pour lier les données retournées il fonctionne très bien. Mais quand je ExecuteSprocAccessor ai eu une erreur ..... The number of parameters does not match number of values for stored procedure

Database db = readConfig.ReadWebConfig(); 
 
       string SP_NAME = "PKG_AR_PRESUPUESTOS_HS.GET_CAMPANAS"; 
 
       
 
       using (DbCommand dbCommand = db.GetStoredProcCommand(SP_NAME)) 
 
       { 
 

 
        dbCommand.Parameters.Clear(); 
 
        db.AddInParameter(dbCommand, "p_COD_PAIS", DbType.Int32, 32); 
 
        db.AddInParameter(dbCommand, "p_COD_COMPANIA", DbType.Int32, 36); 
 
        db.AddInParameter(dbCommand, "p_COD_MEDIO", DbType.Int32, 4); 
 
        db.AddInParameter(dbCommand, "p_COD_CLIENTE", DbType.Int32, 285); 
 
        OracleParameter oraPara1 = new OracleParameter("CURSORSALIDA", OracleType.Cursor); 
 
        oraPara1.Direction = ParameterDirection.Output; 
 
        dbCommand.Parameters.Add(oraPara1); 
 
        
 
         List<Campana> result2 = db.ExecuteDataSet(dbCommand).Tables[0].AsEnumerable().ToList().ConvertAll(dr => new Campana 
 
        { 
 
         COD_CAMPANA = Convert.ToInt32(dr["COD_CAMPANA"].ToString()), 
 
         COD_COMPANIA = Convert.ToInt32(dr["COD_COMPANIA"].ToString()), 
 
         COD_PRODUCTO = Convert.ToInt32(dr["COD_PRODUCTO"].ToString()), 
 
         DES_CAMPANA = dr["DES_CAMPANA"].ToString() 
 
        });

Ce beau travail ...

Mais quand j'utilise

Database db = readConfig.ReadWebConfig(); 
 
       string SP_NAME = "PKG_AR_PRESUPUESTOS_HS.GET_CAMPANAS"; 
 
       
 
       using (DbCommand dbCommand = db.GetStoredProcCommand(SP_NAME)) 
 
       { 
 

 
        dbCommand.Parameters.Clear(); 
 
        db.AddInParameter(dbCommand, "p_COD_PAIS", DbType.Int32, 32); 
 
        db.AddInParameter(dbCommand, "p_COD_COMPANIA", DbType.Int32, 36); 
 
        db.AddInParameter(dbCommand, "p_COD_MEDIO", DbType.Int32, 4); 
 
        db.AddInParameter(dbCommand, "p_COD_CLIENTE", DbType.Int32, 285); 
 
        OracleParameter oraPara1 = new OracleParameter("CURSORSALIDA", OracleType.Cursor); 
 
        oraPara1.Direction = ParameterDirection.Output; 
 
        dbCommand.Parameters.Add(oraPara1); 
 
        
 
List<Campana> result = db.ExecuteSprocAccessor<Campana>(SP_NAME, dbCommand.Parameters).ToList<Campana>(); 
 
            

a obtenu une erreur ... The number of parameters does not match number of values for stored procedure

Même si je peux utiliser Mapping

    IRowMapper<Campana> resmapper = MapBuilder<Campana>.MapAllProperties() 
 
                .Map(x => x.COD_CAMPANA).ToColumn("COD_CAMPANA") 
 
                .Map(x => x.COD_COMPANIA).ToColumn("COD_COMPANIA") 
 
                .Map(x => x.DES_CAMPANA).ToColumn("DES_CAMPANA") 
 
                .Map(x => x.COD_PRODUCTO).ToColumn("COD_PRODUCTO") 
 
                .Build(); 
 
        DataTable dt = db.ExecuteDataSet(dbCommand).Tables[0]; 
 
        
 
    List<Campana> result = db.ExecuteSprocAccessor<Campana>(SP_NAME, resmapper, dbCommand.Parameters).ToList<Campana>();

Je suis la même erreur ...

Quel est le problème avec ExecuteSprocAccessor?

De toute façon, ma classe Campana ressemble à ceci.

public class Campana 
 
    { 
 
     public Int32 COD_COMPANIA { get; set; } 
 
     public Int32 COD_CAMPANA { get; set; } 
 
     public string DES_CAMPANA { get; set; } 
 
     public Int32 COD_PRODUCTO { get; set; } 
 
    }

+0

Peut-être que vous devriez afficher le code de la procédure stockée et –

Répondre

0

Je l'ai résolu le passage d'un objet [] au lieu por cmd.Parameters

object[] param = ParametertoObj(dbCommand); 
 
List<Campana> result = db.ExecuteSprocAccessor<Campana>(SP_NAME, resmapper, param).ToList<Campana>();

et ma classe où je crée un tableau

public object[] ParametertoObj(DbCommand cmd) 
 
      { 
 
       object[] obj = new object[cmd.Parameters.Count]; 
 
       int i = 0; 
 
       foreach (DbParameter item in cmd.Parameters) 
 
       { 
 
        obj[i] = item.Value; 
 
        i++; 
 
       } 
 
       return obj; 
 
      }