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)
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
10750 次 |
| 最近记录: |