#entity-framework #stored-procedures #dynamic #dynamic-tables
#entity-framework #хранимые процедуры #динамический #динамические таблицы
Вопрос:
Хранимая процедура возвращает динамическую таблицу, которая может иметь динамические столбцы. Я хочу получить список данных для tempResult .
IList<SqlParameter> parameters = GetCashInItemsParameters("inv.uspMonthendProces");
string queryString = CreateStoredProcedureExecuteQuery("inv.uspMonthendProcess", parameters);
var tempResult = ExecuteStoredProcedureForDataRetrieve<dynamic>(queryString, parameters.ToArray()).ToList();
CreateStoredProcedureExecuteQuery
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;
}
CreateParameter
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;
}
GetCashInItemsParameters
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;
}
ExecuteStoredProcedureForDataRetrieve
public IList<T> ExecuteStoredProcedureForDataRetrieve<T>(string sqlQuery, params object[] parameters) where T : class
{
return db.Database.SqlQuery<T>(sqlQuery, parameters).ToList();
}
Это то, что я получаю в результате
введите описание изображения здесь
Я пробовал с object
, DataTable
DataSet
. Но это тоже не сработало. Проект, над которым я работаю, использует репозиторий. Поэтому невозможно использовать традиционную ADO.net
Ответ №1:
Три вещи:
-
Вы неправильно написали inv.uspMonthendProces
-
Вы выводите параметр, а не parameter.value для результатов.
-
Столбец, к которому принадлежит параметр, не идентифицирован.
https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparameter
SqlParameter(строка, SqlDbType, Int32, String) Инициализирует новый экземпляр класса SqlParameter, который использует имя параметра, SqlDbType, размер и имя исходного столбца.