C#コードに「すでにオープンなDatareaderがあります...」エラーが発生したのはなぜですか?どうすれば修正できますか?
「すでにオープンなデータリーダーがあります...」エンティティフレームワークのエラーのトラブルシューティング
このエラーは、「最初に閉じなければならないこのコマンドに関連付けられているオープンデータリーダーが既にあります」、別のクエリの結果がまだ処理されている間にデータベースクエリを実行しようとすると、通常発生します。 一般的なシナリオとその解決策を調べてみましょう問題は、多くの場合、メソッドがより大きなクエリの反復内でデータベースクエリを実行するネストされたクエリに起因します。 たとえば、A
このメソッドは、最大値を取得します。 この問題は、別のクエリ内で使用されると発生します:DateLastUpdated
public DateTime DateLastUpdated(long creditorRegistryId, string accountNo) { return (from h in context.AccountHistory where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo select h.LastUpdated).Max(); }
ステートメントの各反復がLastUpdated
を呼び出し、新しいデータリーダーを開きます。 これらの読者を閉じることなく、後続のデータベース操作が失敗し、「オープンデータリーダー」エラーにつながります。
return accounts.AsEnumerable() .Select((account, index) => new AccountsReport() { // ... other properties ... DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber); // ... other properties ... }) // ... rest of the query ...
Select
1。複数のアクティブな結果セット(MARS)DateLastUpdated
最も単純なソリューションは、多くの場合、接続文字列で火星を有効にすることです。 これにより、複数のアクティブなデータリーダーが同時に可能になります。 接続文字列を変更して、
:を含めます
警告:火星はパフォーマンスのオーバーヘッドを導入でき、特に複雑なクエリでは常に理想的なソリューションではありません。
MultipleActiveResultSets=True
connectionString = "Data Source=myServerAddress;Initial Catalog=myDatabase;MultipleActiveResultSets=True;";
より効率的で頻繁に好ましいアプローチは、熱心な荷重です。 ネストされたクエリの代わりに、Entity Frameworkのメソッドを使用して、すべての必要なデータを1つのクエリで取得します:
この単一のクエリは、、、およびデータを取得し、複数のデータリーダーの必要性を排除し、エラーを解決します。 熱心な読み込みにより、データベースへの往復を減らすことでパフォーマンスが向上します。 特定のエンティティの関係に一致するように、
ステートメントを調整することを忘れないでください。 必要に応じて、より深いナビゲーションにを使用することを検討してください
Include
火星と熱心な読み込みを選択することは、アプリケーションの特定のニーズとクエリの複雑さによって異なります。 より良いパフォーマンスとクリーンなコードのために一般的に熱心な読み込みをお勧めしますが、火星はクエリをリファクタリングすることがすぐに実行可能でない場合は簡単な修正を提供します。
以上がC#コードに「すでにオープンなDatareaderがあります...」エラーが発生したのはなぜですか?どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

RAIIは、Cのリソース管理に使用される重要な技術です。そのコアは、オブジェクトのライフサイクルを通じてリソースを自動的に管理することにあります。その中心的なアイデアは、リソースが建設時に取得され、破壊時にリリースされるため、手動のリリースによって引き起こされる漏れの問題を回避することです。たとえば、RAIIがない場合、ファイル操作には手動でfcloseを呼び出す必要があります。中央にエラーがある場合、または事前に戻る場合、ファイルを閉じるのを忘れる場合があります。また、FileHandleクラスがファイル操作をカプセル化するなどのRAIIを使用した後、リソースをリリースするためにスコープを離れた後、デストラクタは自動的に呼び出されます。 1.Raiiは、ロック管理(STD :: LOCK_GUARDなど)、2。MemoryManagement(STD :: ASICE_PTRなど)、3。Databaseおよびネットワーク接続管理などで使用されます。

std :: vectorの最初の要素を取得するための4つの一般的な方法があります。1。front()メソッドを使用して、ベクトルが空でないことを確認し、明確なセマンティクスを持ち、毎日の使用に推奨されます。 2。subscript [0]を使用すると、パフォーマンスはfront()に匹敵するが、わずかに弱いセマンティクスに匹敵するものであるため、空に判断する必要があります。 3。汎用プログラミングとSTLアルゴリズムに適した *begin()を使用します。 4.手動でnullの判断なしに(0)で使用しますが、パフォーマンスが低く、デバッグや例外処理に適した境界を越えたときの例外をスローします。ベストプラクティスは、最初にempty()を呼び出して空であるかどうかを確認し、次にフロント()メソッドを使用して最初の要素を取得して未定義の動作を避けます。

std :: optionalに値があるかどうかを判断するには、has_value()メソッドを使用するか、ifステートメントで直接判断することができます。空になる可能性のある結果を返すときは、nullポインターや例外を避けるためにSTD ::オプションを使用することをお勧めします。それは乱用されるべきではなく、いくつかのシナリオではブールの戻り値または独立したブール変数がより適しています。初期化方法は多様ですが、Reset()を使用して値をクリアし、ライフサイクルと建設行動に注意を払うことに注意を払う必要があります。

C標準ライブラリは、効率的なツールを提供することにより、開発者がコードの品質を向上させるのに役立ちます。 1. STLコンテナは、継続的なストレージに適したベクトル、頻繁な挿入と削除に適したリスト、UNORDERED_MAPなど、シーンに従って選択する必要があります。 2。ソート、検索、変換などの標準ライブラリアルゴリズムは、効率を改善し、エラーを減らすことができます。 3.インテリジェントなポインターunique_ptrとshared_ptrは、漏れを避けるためにメモリを効果的に管理します。 4.オプション、バリアント、機能などのその他のツールは、コードセキュリティと表現力を強化します。これらのコア関数をマスターすると、開発効率とコードの品質を大幅に最適化できます。

関数は、コードの再利用とモジュール化を実現するために使用されるCのコードを整理する基本単位です。 1。関数は、intadd(inta、intb)などの宣言と定義を通じて作成され、2つの数値の合計を返します。 2。関数を呼び出すときにパラメーターを渡し、機能が実行された後に対応する型の結果を返します。 3. return値のない関数は、グリーティング情報を出力するためのvoidgreet(stringName)など、voidを返すタイプとして使用します。 4.関数を使用すると、コードの読みやすさを改善し、重複を避け、Cプログラミングの基本概念であるメンテナンスを促進できます。

c folderexpressionsは、c 17によって導入された機能であり、変数パラメーターテンプレートの再帰操作を簡素化します。 1。左折(args ...)合計(1,2,3,4,5)が15を返すなど、左から右へ。 2。論理的および(args && ...)すべてのパラメーターが真であるかどうかを決定し、空のパケットがtrueを返します。 3。使用(std :: cout

要素を削除するときに反復している場合は、故障したイテレーターの使用を避ける必要があります。正しい方法は、it = vec.erase(it)を使用し、earseによって返された有効なイテレーターを使用してトラバースを続けることです。 batchバッチ削除に推奨される「消去除去」イディオム:vec.erase(std :: remove_if(vec.begin()、vec.end()、条件)、vec.end())、安全で効率的です。 reverse逆イテレータを使用して背面から前面に削除できますが、ロジックは明確ですが、条件方向に注意を払う必要があります。結論:消去リターン値でイテレーターを常に更新し、障害のあるイテレーターの操作を禁止します。そうしないと、未定義の動作が生じます。
