Не удается передать параметр в DbCommand в Entity Framework

У меня ошибка при попытке передать параметр хранимой процедуре с помощью DbCommand

Ошибка возвращена:

Процедура или функция «Имя_процедуры» ожидает параметр «@TEID», который не был предоставлен.

Это мои параметры процедуры:

@PageNumber INT = 1,
@PageSize INT = 50,
@StartTime nvarchar(max) = -1 ,
@EndTime nvarchar(max) = -1 ,
@Month NVARCHAR(2) = -1,
@Year NVARCHAR(4) = -1,
@Day NVARCHAR(2) = -1,
@Hour NVARCHAR(2)=-1,
@TEID nvarchar(max) ,
@IgnoreIdlingTime int=120,
@DrivingTime int=300,--5 minutes by default
@CalculationFactor nvarchar(10)='speed'

Мой код для выполнения процедуры и передачи параметров:

using (var context = new GPSModel())
{
    context.Database.Initialize(force: false);

    // Create a SQL command to execute the stored procedure
    var cmd = context.Database.Connection.CreateCommand();
    cmd.CommandText = "Procedure_Name";

    DbParameter TEIDParam = cmd.CreateParameter();
    TEIDParam.ParameterName = "@TEID";
    TEIDParam.DbType = System.Data.DbType.String;
    TEIDParam.Direction = ParameterDirection.Input;
    TEIDParam.Value = TEID;
    cmd.Parameters.Add(TEIDParam);

    context.Database.Connection.Open();

    var reader = cmd.ExecuteReader();
}

Я пытался удалить знак @ и отправить SqlParameter вместо DbParameter, но проблема осталась.

Есть ли другой способ сделать это, когда моя хранимая процедура очень сложна и содержит несколько наборов?

Спасибо...


person Mohammed Alasa'ad    schedule 02.04.2018    source источник
comment
Вы должны добавить cmd.CommandType = CommandType.StoredProcedure;   -  person Evk    schedule 02.04.2018
comment
Это правда спасибо...   -  person Mohammed Alasa'ad    schedule 02.04.2018


Ответы (2)


Вы можете использовать следующий код для устранения ошибки. Я добавил cmd.CommandType = CommandType.StoredProcedure;. Теперь он работает правильно.

    var cmd = context.Database.Connection.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "Procedure_Name";
    DbParameter TEIDParam = cmd.CreateParameter();
    TEIDParam.ParameterName = "@TEID";
    TEIDParam.DbType = System.Data.DbType.String;
    TEIDParam.Direction = ParameterDirection.Input;
    TEIDParam.Value = TEID;
    cmd.Parameters.Add(TEIDParam);

Когда вы используете хранимую процедуру, вы должны установить для свойства CommandType значение StoredProcedure, а затем вы должны установить для свойства CommandText имя хранимой процедуры. Команда выполняет эту хранимую процедуру, когда вы вызываете один из методов Execute.

person Vignesh VS    schedule 02.04.2018

ДЛЯ ядра EF это можно сделать с помощью fromSQL()

var tbl = new DataTable();
           tbl.Columns.Add("id", typeof(string));

        foreach (var item in imageChunkRequest.ChunkNames)
        {
               tbl.Rows.Add(item);

        }
 SqlParameter Parameter = new SqlParameter();
                Parameter.ParameterName = "@udt";
                Parameter.SqlDbType = SqlDbType.Structured;
                Parameter.Value = tbl;
                Parameter.TypeName = "dbo.StringList";

     _dbContext.Set<T>().FromSql("EXEC dbo.FindChunks @udt",Parameter);
person Taran    schedule 12.02.2019