如何使用实体框架4访问“结果”,“消息”,和一个“返回值”存储过程?(How to access &

2019-09-02 02:34发布

如何访问使用实体框架4.4和C#4.0中的“结果”,“消息”,和一个“返回值”存储过程?

下面是存储过程有三个参数。 这种或那种方式,当我运行存储过程我应该,我希望,能够获得全部三个值“结果”,“消息”和“返回值”。

有人可以帮助我弄清楚如何做到这一点与EF? 使用生成了EF所有的我似乎能够访问是代码的查询的“结果”(返回行)

存储过程

USE [THIS_DB]  
GO  

SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  

ALTER PROCEDURE [dbo].[THIS_PROCEDURE]  
    @FIRST_PARAM CHAR(17) = NULL,  
    @SECOND_PARAM CHAR(2) = NULL,  
    @THIRD_PARAM CHAR(5) = NULL  
AS  
BEGIN  
    SET NOCOUNT ON;  
    DECLARE @ReturnValue INT = 0;  
    IF COALESCE(@SECOND_PARAM, 'XX') NOT IN ('XX', 'YY')  
    BEGIN  
        RAISERROR('Invalid @SECOND_PARAM value: %s; @SECOND_PARAM mXXt be XX or YY.', 2, 1, @SECOND_PARAM ) WITH SETERROR;  
        SET @ReturnValue = -50100;  
    END  
    IF COALESCE(@SECOND_PARAM, 'XX') = 'YY'  
    BEGIN  
        RAISERROR('@SECOND_PARAM value: %s; YY is valid, but currently is not supported, returning XX results.', 2, 1, @SECOND_PARAM) WITH SETERROR;  
        SET @ReturnValue = -50105;  
    END  
    IF COALESCE(@THIRD_PARAM, 'XX-EN') NOT IN ('XX-EN')  
    BEGIN  
        RAISERROR('Invalid @THIRD_PARAM value: %s; @THIRD_PARAM mXXt be XX-EN.', 2, 1, @THIRD_PARAM) WITH SETERROR;  
        SET @ReturnValue = -50101;  
    END  
    SELECT DISTINCT  
        THESE.VALUES  
        FROM dbo.THIS_TABLE  
        WHERE THESE.CONDITIONS;  

    IF @@ROWCOUNT = 0  
    BEGIN  
        DECLARE @SP_MATCHCOUNT INT  

        EXEC @SP_MATCHCOUNT = [dbo].[MATCHTABLE] @PATTERNH = @PATTERN  
        IF @SP_MATCHCOUNT > 0  
        BEGIN  
            RAISERROR('Mapping from HERE to HERE not found for PATTERN: %s.', 2, 1, @PATTERN) WITH SETERROR  
            SET @ReturnValue = -50103;  
        END  
        ELSE  
        BEGIN  
            RAISERROR('PATTERN Pattern not found for PATTERN: %s.', 2, 1, @PATTERN) WITH SETERROR  
            SET @ReturnValue = -50104;  
        END  
    END  
    RETURN @ReturnValue  
END  

public virtual ObjectResult<THIS_PROCEDURE_RESULT> THIS_PROCEDURE_METHOD(string FIRST, string SECOND, string THIRD)  
{  
    var FIRST_PARAM = FIRST != null ?  
        new ObjectParameter("FIRST", FIRST) :  
        new ObjectParameter("FIRST", typeof(string));  

    var SECOND_PARAM = SECOND != null ?  
        new ObjectParameter("SECOND", SECOND) :  
        new ObjectParameter("SECOND", typeof(string));  

    var THIRD_PARAM = THIRD != null ?  
        new ObjectParameter("THIRD", THIRD) :  
        new ObjectParameter("THIRD", typeof(string));  

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<THIS_PROCEDURE_RESULT>("THIS_PROCEDURE", FIRST_PARAM, SECOND_PARAM, THIRD_PARAM);  
}  

Answer 1:

因此,首要的事情:-)只是想确保我们在同一页上,我才回答了3个部分的问题。 EF被设计成一个ORM(对象关系映射器)。 这意味着其为存在目的是为了转换关系数据代码对象(并且反之亦然)。 它使用这个机制是结果集(不返回值)。 所以,最里面EF管道的专门用来对结果集进行操作,也可以自动生成SQL用于获取这些结果集。 然而,由于人们要求它,EF现在有执行存储过程的能力,但这种能力是不全面的,而且是那种副作用的产品的主要功能。 话虽如此,EF确实使用ADO.NET在幕后,而这也正是你会得到你的答案,因为ADO.NET做处理所有的场景。

第一个问题 - 怎样才能得到结果。 EF会在这种情况下执行该SP,想必,它映射到某个对象具有相匹配的结果列,其特性。 这意味着,将EF创建集合(枚举查询结果设定为更准确的)对象,其每一个代表在结果数据的一排。 在你的情况,你的方法的返回值是ObjectResult。 ObjectResult是对象的集合,并且每个项目是类型THIS_PROCEDURE_RESULT,这反过来又具有用于结果的每个映射列的属性。

第二个问题 - 如何获取消息。 如果RAISERROR与一定范围内的严重程度使用时,将导致ADO.NET抛出和异常(SqlException类型的)。 EF只会只是表面(通过)的错误。 这的SQLException实例将包含所有的错误和消息的信息。 看到它,你只需要捕获错误:

try
{
    // call EF SP method here...
}
catch(SqlException se)
{
    Debug.WriteLine(se.Message);
}
catch(Exception e)
{
    // all non-DB errors will be seen here...
}

但是,如果RAISERROR语句是警告或信息严重程度,ADO.NET不会抛出异常。 在这种情况下,你必须使用的连接对象的事件,看看从DATABSE信息和警告消息。 要做到这一点在EF,你必须得到来自EF对象上下文EntityConnection,然后得到从EntityConnection的存储连接。 如果您在使用SQL Server程序(SqlClient ADO.NET提供商),这将是一个SqlConnection实例。 该实例包含一个名为InfoMessage的事件。 您可以挂钩一个事件处理该事件陷阱消息。 这里更多信息: http://support.microsoft.com/kb/321903

最后一个问题 - 如何让返回值。 这个人会吸。 根据我的第一段,EF是不是真的设计,可任意处理SP的电话。 虽然将映射结果集到对象集合,它不会从SP的返回值。 你将不得不使用ADO.NET没有EF层以访问SqlCommand对象的参数集合。 其中一个参数是参数类型返回值的,它包含的返回值本身。



文章来源: How to access 'Results', 'Messages', and 'Return Value' of a Stored Procedure using Entity Framework 4?