我有一个正常返回记录集的存储过程,但在某些情况下它根本不会返回记录集。这让EF有些悲伤:
“数据阅读器与指定的'myDBContext.usp_MyProc_Result'不兼容。该类型的成员'TheFirstColumn'在数据阅读器中没有相应的具有相同名称的列。”
有没有办法可以告诉它只是返回null或类似的东西,如果proc不返回任何东西
答案 0 :(得分:1)
在处理包含事务的非常高度并发的存储过程调用时,我只看过EF + MySQL的这个问题,但是一旦它第一次发生,它会发生几千倍,非常快。 有趣的是,我从来没有在EF + SQLServer上出现这个错误,而且我经常使用它。
我已经采取了一些措施来纠正这个问题:
首先,您应该更新存储过程并实现一些异常处理。 我知道OP说这对他来说是不可能的,但无论如何它应该是第一次求助!这个例子在mysql
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。 以下是c#
中的示例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...
祝你好运!
答案 1 :(得分:0)
据我所知,EF允许我们根据存储的返回值创建复杂类型。
你可以关注这篇文章