实体框架调用存储过程需要未提供的参数

时间:2014-02-25 12:00:11

标签: c# sql sql-server entity-framework stored-procedures

我通过实体框架调用我的SP,如下所示:

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

为什么我收到此错误的任何想法?

6 个答案:

答案 0 :(得分:14)

如果是这种情况,它可能应该抱怨@user参数,但无论如何 - 尝试提供不带@前缀的参数:

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

答案 1 :(得分:13)

问题是EF为NULL值生成的SQL必须与我们的实际Sql Server不兼容。我正在使用EntityFramework 6,但我不认为自4.3以来实现已经改变。

当我打开跟踪时,我在执行上面的类似代码后得到以下输出:

exec sp_executesql N'super_group',N'@userName nvarchar(4000)',@userName=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

希望有所帮助。

答案 2 :(得分:2)

我的情况我通过明确地将类型添加到我传入的参数中来解决问题,该参数在存储过程中定义为一点

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

答案 3 :(得分:2)

传递多个参数时,参数未通过问题

我失踪了&#39; SPACE&#39;在第一个参数&#39; COMMA&#39;

之后
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();

答案 4 :(得分:0)

在我们的案例中,这是确保参数的第一个字母不是数字而是字母的问题。

将6cb更改为p6cb,问题就消失了。

答案 5 :(得分:-1)

在我的情况下,问题是可以为空的,我发送 int? 可以为空来存储过程参数 int。其中 nullable 必须转换为 nvarchar(4000)