这是我的SQL Server存储过程:

ALTER PROCEDURE [dbo].[SearchUser]
  (@Text NVARCHAR(100),
   @TotalRows INT = 0 OUTPUT)
AS
BEGIN
   SELECT @TotalRows=1000
   SELECT * from Users
END


还有我的C#代码

using (var context = new TestDBEntities())
{
    var outputParameter = new ObjectParameter("TotalRows", typeof(Int32));
    context.SearchUser("", outputParameter);
    Response.Write(outputParameter.Value);
}


但是outputParameter.Value始终为null。

有人可以告诉我为什么吗?

最佳答案

在存储过程执行期间,输出参数由其实际值填充。

但是,表值存储过程实际上仅在尝试迭代结果记录集时才执行,而没有调用包装方法。

因此,这不起作用:

using (var context = new TestDBEntities())
{
    var outputParameter = new ObjectParameter("TotalRows", typeof(Int32));
    context.SearchUser("", outputParameter);

    // Paremeter value is null, because the stored procedure haven't been executed
    Response.Write(outputParameter.Value);

}


这样做:

using (var context = new TestDBEntities())
{
    var outputParameter = new ObjectParameter("TotalRows", typeof(Int32));

    // Procedure does not executes here, we just receive a reference to the output parameter
    var results = context.SearchUser("", outputParameter);

    // Forcing procedure execution
    results.ToList();

    // Parameter has it's actual value
    Response.Write(outputParameter.Value);

}


当您使用存储过程而不返回任何记录集时,它们将在方法调用后立即执行,因此您在输出参数中具有实际值。

关于stored-procedures - 使用 Entity Framework 导入功能时无法获取输出参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5881359/

10-11 02:56