6

我有一个通常返回记录集的存储过程,但在某些情况下它根本不返回记录集。这让 EF 感到有些悲痛:

“数据读取器与指定的‘myDBContext.usp_MyProc_Result’不兼容。类型的成员‘TheFirstColumn’在数据读取器中没有同名的对应列。”

如果proc没有返回任何东西,有没有办法告诉它只返回null或类似的东西

4

2 回答 2

1

在处理包含事务的非常高并发的存储过程调用时,我只见过 EF + MySQL 的这个问题,但是一旦它第一次发生,它就会发生几千倍,非常快。有趣的是,我在使用 EF + SQLServer 时从未遇到过这个错误,而且我更频繁地使用它。

为了纠正这个问题,我做了一些事情:

数据库级

首先,您应该更新存储过程并实现一些异常处理。 我知道 OP 说这对他来说是不可能的,但无论如何它应该是第一个追索权!这个例子在

CREATE PROCEDURE `YourProcedureName` (IN YourParameter YourType)
BEGIN
    DECLARE STUFF;

    -- Thanks to tips from http://khanrahim.wordpress.com/2010/05/16/transaction-with-stored-procedure-in-mysql-server/
    -- and syntax from http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SQLWARNING 
    BEGIN 
        ROLLBACK; 
        SELECT AnInstanceOfTheResultSet FROM YourTable WHERE 1 = 0; -- Force an empty result-set 
    END;

    START TRANSACTION;
        -- Do your complex operations
    COMMIT;
END

代码内

其次,在代码中,使用所引发的最具体的异常来包装您的 EF 调用,即:EntityCommandExecutionException。中的一个示例

YourType result = null;
try 
{ 
    result = yourContext.YourProcedureName(YourParameter).FirstOrDefault(); 
}
catch (EntityCommandExecutionException ecee) 
{ 
    // Log it? Handle it somehow... 
}
if (result == null)
{
    // Handle your error state
}

// Continue processing normally...

祝你好运!

于 2012-12-24T21:41:09.347 回答
0

据我所知,EF 允许我们根据存储的返回值创建复杂类型。

你可以关注这个帖子

http://weblogs.asp.net/dotnetstories/archive/2011/03/01/using-stored-procedures-with-entity-framework-in-an-asp-net-application.aspx

于 2012-06-15T06:29:47.677 回答