Microsoft SQL Server 2005のストアドプロシージャに3つのselectステートメントをコーディングしました。両方のselectステートメントは、複数のレコードとselectステートメントのテーブルリストを返します異なります。 1つはマスタテーブルからのレコード、もう1つは子テーブルからのレコードです。 C#のコードでは、これらのレコードをすべて取得し、すべてのデータを1つのオブジェクトに入れたいと考えています。私はSqlDataReaderを使用しています。それで可能か、他に何かするべきか?ストアドプロシージャ内に複数のselectステートメントがある場合のSqlDataReaderの使用方法
答えて
クエリから複数の結果を使用してナビゲートするには、the NextResultメソッドをdatareaderで使用します。すべてのデータをループし
あなたはこのようなものだろう:背景としてそれとそう
var moreResults = true;
while (moreResults)
{
while (reader.Read())
{
...
}
moreResults = reader.NextResult();
}
を、マスター結果セットをと仮定すると最初に来る、移入マスターとディテールのオブジェクトは、次のように行うことができる。
まず、マスタレコードの辞書を構築する:
var masters = new Dictionary<int, Master>();
var idOrdinal = reader.GetOrdinal("id");
while (reader.Read())
{
var id = reader.GetInt32(idOrdinal);
masters.Add(id, new Master{Id=id, ....});
}
次に、詳細レコードに移動し、それに対応するマスターにそれらを追加します。
reader.NextResult();
var masterIdOrdinal = reader.GetOrdinal("masterId");
while (reader.Read())
{
var masterId = reader.GetInt32(masterIdOrdinal);
var master = masters[masterId];
master.Details.Add(new Detail{....});
}
明らかに、列名をデータ内のものに置き換え、マスターおよびディテールオブジェクトの完全な初期化を行う必要があります。 詳細結果セットがマスターIDでソートされている場合、最後のループは辞書から各マスターを1回だけ検索するように最適化できます。しかし、結果セットが小さい場合、利益はそれほど大きくはありません。
...私はこのすべてのレコードを取得したいと一つのオブジェクトに このすべてのデータを入れてC#コード .INマスタテーブル と子テーブルから他の1つの選択を記録...
Peterのソリューションは、複数の結果を単一のDataReader
で取得するという基本的な問題を解決するために機能します。ただし、マスター - 詳細テーブル間の関係を複製するオブジェクトにデータを保存する場合は、代わりにDataSet
を使用する必要があります。
DataSetsには複数のDataTable
を含めることができ、テーブル間にDataRelation
の作成を許可することで、テーブル間の固有の関係を完全にサポートできます。次に、マスタまたは詳細テーブルからそれぞれGetChildRows()
またはGetParentRows()
を呼び出すことによって、各シナリオの関連レコードを取得できます。
おそらくこれを行う方法を説明するサンプルがオンラインに多数あります。 Here's one discussion thread私のグループから私はステップをリストアップし、プロシージャを示すためのコードをいくつか提供しました。
ありがとうございます。今、私が始めたことを終えました:) –
- 1. selectステートメントのストアドプロシージャ
- 2. VB.net SqlDataReader GetString関数にnull値がある場合のmessageboxの表示方法?
- 3. バッチファイル内にExistステートメントがある場合
- 4. "using"ステートメントの内部でSqlDataReaderを使用する必要がありますか?
- 5. SQLITE3複合 "Select"ステートメント
- 6. 内部結合内のElseステートメントがある場合
- 7. If ... Then ...複数のステートメントを使用する場合
- 8. MDXの場合の複数のステートメント
- 9. 別のSELECTステートメント内のSELECTステートメント
- 10. .netからストアドプロシージャのselectステートメントを実行する方法
- 11. selectステートメント内でスカラー関数を複数回呼び出すことは、関数を複数回実行しますか?その場合、回避する方法
- 12. キャンバス内に複数の画像がある場合は
- 13. 文字列内に複数の一致がある場合
- 14. SELECTステートメントからMySQLストアドプロシージャ変数
- 15. whileステートメント内のselectステートメント
- 16. selectステートメント内の結合されたテーブル
- 17. NSRangeException複数のテキストフィールドに複数のpickerViewがある場合
- 18. 複数のSELECT NEWステートメントを使用したjpaコンストラクタ式
- 19. jQuery:複数のSelectステートメントのハイライトオプション
- 20. Repo(googletest)に複数のライブラリがある場合のCMake ExternalProjectの処理方法?
- 21. 別のステートメントでPHP mysql selectステートメントのデータを正しく使用する方法
- 22. 複数のパッケージが使用されている場合、汎用関数を定義する場所と方法
- 23. MySQLの 'insert'ステートメントで 'select'を使用する方法
- 24. ジョインを使用して1つのSelectステートメントに複数のカウントがありますか?
- 25. 複数使用ステートメントがある場合、それらは順番に実行されますか?
- 26. 更新ステートメント内で複数のテーブルに結合する
- 27. ストアドプロシージャ内に複数のストアドプロシージャがあり、待機しています
- 28. ストアドプロシージャ内のFirebird CASEステートメント
- 29. selectステートメント内のサブクエリを結合にリファクタリングする
- 30. 複数の挿入文を使用する場合、SCOPE_IDENTITYを使用する方法はありますか?
丁寧に回答していますが、質問の一部を未回答のまま残していると思います。 ;-) – Cerebrus