通过执行存储过程使用实体框架返回数据表

时间:2019-03-08 10:47:05

标签: entity-framework stored-procedures dynamic dynamic-tables

存储过程返回动态表,该表可以具有动态列。我想检索tempResult的数据列表。

sys.append()

CreateStoredProcedureExecuteQuery

IList<SqlParameter> parameters = GetCashInItemsParameters("inv.uspMonthendProces");
string queryString = CreateStoredProcedureExecuteQuery("inv.uspMonthendProcess", parameters);
var tempResult = ExecuteStoredProcedureForDataRetrieve<dynamic>(queryString, parameters.ToArray()).ToList();

CreateParameter

public static string CreateStoredProcedureExecuteQuery(string storedProcedureName, IList<SqlParameter> parameters)
{
            string result = string.Empty;
            string parameterString = string.Join(
                ",", parameters.Select(i => i.ParameterName));
            result = string.Format(
                "{0} {1}", storedProcedureName, parameterString);

            return result;
}

GetCashInItemsParameters

public static SqlParameter CreateParameter(string parameterName, object value, SqlDbType dbType)
        {
            SqlParameter param = new SqlParameter(parameterName, dbType);
            param.Value = value;
            param.Value = value ?? (object)DBNull.Value;
            return param;
        }

ExecuteStoredProcedureForDataRetrieve

public static IList<SqlParameter> GetCashInItemsParameters(string storedProcedureName)
        {
            IList<SqlParameter> parameters = new List<SqlParameter>();
            try
            {
                parameters.Add(CreateParameter(
                    "@Year", 2019, SqlDbType.Int));
                parameters.Add(CreateParameter(
                    "@Month", 3, SqlDbType.Int));
                parameters.Add(CreateParameter(
                    "@FromDate", "2019-03-01", SqlDbType.Date));

                parameters.Add(CreateParameter(
                    "@ToDate", "2019-03-31", SqlDbType.Date));
                parameters.Add(CreateParameter(
                    "@CashCentreId",1, SqlDbType.Int));
                parameters.Add(CreateParameter(
                    "@CustomerId", 2, SqlDbType.Int));
                parameters.Add(CreateParameter(
                    "@CurrencyId", 1, SqlDbType.Int));

            }
            catch (Exception ex)
            {
            }

            return parameters;
        }

这就是我得到的结果

enter image description here

我尝试使用public IList<T> ExecuteStoredProcedureForDataRetrieve<T>(string sqlQuery, params object[] parameters) where T : class { return db.Database.SqlQuery<T>(sqlQuery, parameters).ToList(); } objectDataTable。但这也没有用。我正在从事的项目正在使用存储库。因此无法使用传统的ADO.net

1 个答案:

答案 0 :(得分:0)

三件事:

  1. 您拼错了inv.uspMonthendProces

  2. 您正在输出一个参数,而不是结果的parameter.value。

  3. 该参数所属的列未被标识。

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparameter

SqlParameter(字符串,SqlDbType,Int32,字符串) 初始化SqlParameter类的新实例,该实例使用参数名称,SqlDbType,大小和源列名称。