通常はレコードセットを返すストアド プロシージャがありますが、特定の状況ではレコードセットがまったく返されません。これはEFにいくつかの悲しみを引き起こしています:
「データ リーダーは、指定された 'myDBContext.usp_MyProc_Result' と互換性がありません。型のメンバー 'TheFirstColumn' には、データ リーダーに同じ名前の対応する列がありません。」
procが何も返さない場合、nullまたはそのようなものを返すように伝える方法はありますか
通常はレコードセットを返すストアド プロシージャがありますが、特定の状況ではレコードセットがまったく返されません。これはEFにいくつかの悲しみを引き起こしています:
「データ リーダーは、指定された 'myDBContext.usp_MyProc_Result' と互換性がありません。型のメンバー 'TheFirstColumn' には、データ リーダーに同じ名前の対応する列がありません。」
procが何も返さない場合、nullまたはそのようなものを返すように伝える方法はありますか
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
次に、コードで、スローされる最も具体的な例外 (EntityCommandExecutionException) で EF 呼び出しをラップします。これは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...
幸運を!
私が知っているように、EF では、格納された戻り値に基づいて複合型を作成できます。
この投稿をフォローできます