如何从数据库独立应用程序c#,codefirst调用存储过程

时间:2017-01-05 10:48:25

标签: mysql sql-server database stored-procedures database-independent

我为我的应用程序支持的每种数据库类型创建了过程。并添加到他们的迁移文件中。

我可以在我的代码第一个app中调用存储过程MSSQL这两种类型 一个

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

2

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

但是当db提供程序更改为mysql时,它会出错。

未处理的类型' MySql.Data.MySqlClient.MySqlException'发生在EntityFramework.dll中 附加信息:只能存储MySqlParameter对象

并且提供者也可以更改oracle postgresql mysql等。

如何解决这个问题?

我不想使用if provider == mssql if provider == mysql等...

这是我的主要功能

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

1 个答案:

答案 0 :(得分:0)

这是我能找到的最佳用途。如果没有开关盒或没有其他方法

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

    }

用法:

 worker.StoredProcedures.sp_uservirman(1, 2);