我试图使用EF6 / CodeFirst来使用存储过程。此SP通过OUTPUT参数返回几个值。我在other places看到这可能是不可能的,但是这篇文章已经很老了,只是想知道现在是否已经解决了这个问题。
使用RAW Sql执行时我的SP(在SSMS中)就像这样工作;
declare @p10 int
declare @p11 uniqueidentifier
set @p10=NULL
set @p11=NULL
exec dbo.uspTestStoredProc @id = 2021, @name=N'qa1231321asda.txt',
@documentId=@p10 OUTPUT,@documentStreamId=@p11 output
select @p10,@p11
这个正确打印出documentId(p10)和documentStreamId(p11)
然而,当通过EF执行时,这两个OUTPUT参数都为空。我已经将.Net代码和通过EF生成的SQL包含在内,以供进一步调查。
var sqlString = "exec dbo.uspTestStoredProc @id,@name,@documentId,@documentStreamId";
var paramCollection = new List<Object>
{
new SqlParameter("id", 81),
new SqlParameter("name", "qa1231321asda2.txt"),
};
var paramDocId = new SqlParameter
{
ParameterName = "@documentId",
SqlDbType = SqlDbType.Int,
Value = 0,
Direction = ParameterDirection.Output
};
paramCollection.Add(paramDocId);
var paramStreamId = new SqlParameter
{
ParameterName = "@documentStreamId",
SqlDbType = SqlDbType.UniqueIdentifier,
Value = DBNull.Value,
Direction = ParameterDirection.Output
};
paramCollection.Add(paramStreamId);
_context.Database.ExecuteSqlCommand(sqlString, paramCollection.ToArray());
var docId = (int) paramDocId.Value; //Fails because paramDocId is DBNull
declare @p10 int
declare @p11 uniqueidentifier
set @p10=NULL
set @p11=NULL
exec sp_executesql N'exec dbo.uspTestStoredProc @id,@name,@documentId,@documentStreamId',
N'@id int,@name nvarchar(45), @documentId int output,@documentStreamId uniqueidentifier output',
@id=81,@name=N'qa1231321asda2.txt',@documentId=@p10 output,@documentStreamId=@p11 output
select @p10, @p11
现在@ p10和@ p11返回NULL。
我试图找出以下内容
非常感谢。
答案 0 :(得分:1)
我想我终于找到了答案。诀窍在于传入命令的sqlString。
var sqlString = "exec dbo.uspTestStoredProc @id,@name,
@documentId OUT,@documentStreamId OUT";
注意2个输出参数后面的关键字“OUT”。它成功了。当然,在添加参数时,还需要指定适当的SQL参数选项,如ParameterDirection.Output。