EF6 CodeFirst - 处理OUTPUT参数

时间:2015-11-12 06:30:26

标签: sql-server entity-framework stored-procedures ef-code-first

我试图使用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包含在内,以供进一步调查。

.Net Code

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

EF生成的SQL

    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。

我试图找出以下内容

  1. EF6 / CodeFirst可以支持存储过程中的OUTPUT参数吗?
  2. 如果是这样,我需要做些什么?
  3. 如果没有,有什么想法可以使用该功能吗?
  4. 非常感谢。

1 个答案:

答案 0 :(得分:1)

我想我终于找到了答案。诀窍在于传入命令的sqlString。

    var sqlString = "exec dbo.uspTestStoredProc @id,@name,
                     @documentId OUT,@documentStreamId OUT";

注意2个输出参数后面的关键字“OUT”。它成功了。当然,在添加参数时,还需要指定适当的SQL参数选项,如ParameterDirection.Output。