0

J'ai créé une procédure pour chaque type de base de données pris en charge par mon application. et ajouté dans leurs fichiers de migration.Comment appeler une procédure stockée à partir d'une application indépendante de la base de données C#, codefirst

je peux appeler la procédure MSSQL enregistrées comme deux types dans mon code première application un

worker.StoredProcedures.ExecuteWithStoreProcedure("sp_userVirman @ResourceUserID,@targetUserID", 
new SqlParameter("ResourceUserID",DbType.Int64) { Value = 1 }, 
new SqlParameter("targetUserID", DbType.Int64) { Value = 2 }); 

deux

worker.StoredProcedures.ExecuteWithStoreProcedure(string.Format("sp_userVirman {0},{1}", 1, 2)); 

mais lorsque le changement de fournisseur de db mysql, il donne l'erreur.

Une exception non gérée du type 'MySql.Data.MySqlClient.MySqlException' a eu lieu dans EntityFramework.dll Informations complémentaires: Seuls les objets MySqlParameter peuvent être stockés

et aussi les fournisseurs peuvent changer oracle postgresql mysql etc.

comment peut résoudre ce problème?

je ne veux pas utiliser si fournisseur == == MSSQL si fournisseur mysql etc ...

ceci est ma principale fonction

public void ExecuteWithStoreProcedure(string query, params object[] parameters) 
    { 
     _dbContext.Database.ExecuteSqlCommand(query, parameters); 
    } 

Répondre

0

c'est le meilleur usage que je peux trouver. il n'y a aucun moyen sans cas de commutation ou si d'autre

public void sp_uservirman(Nullable<int> resourceUserID, Nullable<int> targetUserID) 
    { 
     switch (GlobalData.CustomerDataSourceType) 
     { 
      case ContextFactory.DataSourceTypes.None: 
       break; 
      case ContextFactory.DataSourceTypes.MSSQL: 
       SqlParameter param= new SqlParameter("@resourceuserıd",resourceUserID); 
       SqlParameter param1= new SqlParameter("@targetUserID",targetUserID); 
       _dbContext.Database.ExecuteSqlCommand("sp_uservirman @resourceuserıd,@targetUserID", param, param1); 
       break; 
      case ContextFactory.DataSourceTypes.MySQL: 

       MySqlParameter param3 = new MySqlParameter("@resourceuserıd", resourceUserID); 
       MySqlParameter param4 = new MySqlParameter("@targetUserID", targetUserID); 


       _dbContext.Database.ExecuteSqlCommand("CALL sp_uservirman (@resourceuserıd,@targetUserID)", param3, param4); 
       break; 
      case ContextFactory.DataSourceTypes.ORACLE: 

       string query = string.Format("BEGIN SP_USERVIRMAN ({0},{1}) ; END;", resourceUserID, targetUserID); 
       _dbContext.Database.ExecuteSqlCommand(query); 

       break; 
      default: 
       break; 
     } 

    } 

Utilisation:

worker.StoredProcedures.sp_uservirman(1, 2);