我通过实体框架调用我的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
为什么我收到此错误的任何想法?
答案 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)
。