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

Ste*_*ieB 13 c# sql sql-server stored-procedures entity-framework

我通过Entity Framework调用我的SP,如下所示:

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

并得到错误

过程或函数'super_group'需要参数'@orderbyUnique',这是未提供的.

如上所示我正在提供它.

这是存储过程:

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

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

JLe*_*JLe 14

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

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


Dej*_*sic 13

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

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

exec sp_executesql N'super_group',N'@userName nvarchar(4000)',@userName=default
Run Code Online (Sandbox Code Playgroud)

问题在于传递的"默认"值而不是"NULL",我们看到的错误来自SQL服务器.如果你想快速修复并且不需要命名参数,你可以使用它:

NextSuperGroup supergroup = entities.Database.SqlQuery<NextSuperGroup>(
   "super_group",
    userName).First();
Run Code Online (Sandbox Code Playgroud)

哪个产生类似的东西并且效果很好:

exec sp_executesql N'super_group',N'@p0 nvarchar(4000)',@p0=NULL
Run Code Online (Sandbox Code Playgroud)

对于命名参数,您需要使用sql参数并将值或SqlValue属性显式设置为DBNull.Value(我知道疯狂).像这样的东西:

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

希望有所帮助.

  • 完美答案!你做了我的一天! (2认同)