Entity Framework, вызывающая хранимую процедуру, ожидает параметр, который не был поставлен

Я вызываю свой SP через Entity Framework следующим образом:

NextSuperGroup supergroup = entities.Database.SqlQuery<NextSuperGroup>(
      "super_group @user, @orderbyUnique",
      new SqlParameter("@user", userName),
      new SqlParameter("@orderbyUnique", true)).First();

И получение ошибки

Процедура или функция 'super_group' ожидает параметра '@orderbyUnique', который не был предоставлен.

Как вы можете видеть выше, я поставляю его.

Здесь хранимая процедура:

ALTER PROCEDURE [dbo].[super_group]
     @user nvarchar(30)
    ,@stepLockDelay varchar(10) = '00:00:00'
    ,@orderbyUnique bit
AS

Любые идеи, почему я получаю эту ошибку?

Ответ 1

Вероятно, он также должен жаловаться на параметр @user, если это так, но в любом случае - попробуйте указать параметр без префикса @:

NextSuperGroup supergroup = entities.Database.SqlQuery<NextSuperGroup>(
    "super_group @user, @orderbyUnique",
    new SqlParameter("user", userName),
    new SqlParameter("orderbyUnique", true)
).First();

Ответ 2

Проблема заключается в том, что SQL, который EF создает для значений NULL, не должен быть совместим с нашим фактическим сервером Sql. Я использую EntityFramework 6, но я не думаю, что реализация изменилась с 4.3.

Когда я включил трассировку, я получаю следующий результат после выполнения аналогичного кода выше:

exec sp_executesql N'super_group',N'@userName nvarchar(4000)',@userName=default

Проблема заключается в значении "default", которое передается вместо "NULL", и ошибка, которую мы видим, поступает с SQL-сервера. Если вы хотите быстро исправить и не нуждаетесь в именованных параметрах, вы можете просто использовать это:

NextSuperGroup supergroup = entities.Database.SqlQuery<NextSuperGroup>(
   "super_group",
    userName).First();

Что производит что-то вроде этого и прекрасно работает:

exec sp_executesql N'super_group',N'@p0 nvarchar(4000)',@p0=NULL

Для именованных параметров вам нужно использовать параметр sql и явно указать значение или свойство SqlValue в DBNull.Value(Crazy я знаю). Что-то вроде этого:

var parameter = new SqlParameter("userName", SqlDbType.VarChar);
parameter.SqlValue = username.SqlNullIfEmpty(); // Implemented with an extension method

Надеюсь, что это поможет.

Ответ 3

В моем случае я исправил проблему, явно добавив тип к параметру, который я передавал, в котором была определена в хранимой процедуре как бит

        var paramExcludeExported = new SqlParameter
        {
            ParameterName = "ExcludeExported",
            SqlDbType = SqlDbType.Bit,
            Value = 0
        };

Ответ 4

Параметр не прошел проблему при передаче нескольких параметров

Я потерял "ПРОСТРАНСТВО" после первого параметра "COMMA"

var parameter = new List<object>();
var param = new SqlParameter("@CategoryID", CategoryID);
parameter.Add(param);
param = new SqlParameter("@SubCategoryID", SubCategoryID);
parameter.Add(param);

List<tbl_Product> QueryResult = db.Database.SqlQuery<tbl_Product>("EXEC SP_GetProducts @CategoryID, @SubCategoryID ", parameter.ToArray()).ToList();