【问题标题】:Unable to read value returned from a stored procedure using Entity Framework无法使用实体框架读取从存储过程返回的值
【发布时间】:2015-06-04 11:24:15
【问题描述】:

我编写了一个存储过程,如果找到,它将返回一行的 ID,如果没有找到,将创建一行并返回新创建的行的 ID。我在 C# 函数中检索此返回值时遇到问题。


存储过程:

PROCEDURE [TagDatabase].[GetTagID] 
    -- Add the parameters for the stored procedure here
    @TagName as varchar(200), 
    @UserID int = 0,
    @TagID int = 0 OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    select @TagID=ID from Tag where Name = @TagName and UserID=@UserID;
    IF NULLIF(@TagID, '') IS NULL
    BEGIN
        DECLARE @OutputTbl TABLE (ID INT)

        INSERT INTO Tag(Name, ParentID, UserID)
        OUTPUT INSERTED.ID INTO @OutputTbl(ID)
        VALUES (@TagName, 0, @UserID);

        select @TagID=ID from @OutputTbl


    END

    select @TagID
END

我的函数来检索 this 返回的值:

ObjectParameter objParam = new ObjectParameter("TagID", typeof(long));

context.GetTagID("newTag", 10, objParam);
context.SaveChanges();
long id = Convert.ToInt64(Convert.ToInt64(id)));

【问题讨论】:

    标签: c# sql-server stored-procedures entity-framework-6


    【解决方案1】:

    改变

    long id = Convert.ToInt64(Convert.ToInt64(id)));

    long id = Convert.ToInt64(objParam.Value);

    【讨论】:

    • 你建议的表达式总是返回 0。然而,如果我在 SQL Server Management Studio 上运行相同的程序,它工作得非常好。事实上,objParam.Value 总是作为 null 接收。
    • 我不确定为什么这行不通,您是否将最后的选择 @TagID 留在代码中?这将返回一个结果集,但您仍然应该能够获得输出参数。我能想到的唯一另一件事是将 typeof(long) 更改为 typeof(int) 以匹配您存储的 proc 参数。
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多