2009-04-12 39 views
6

Microsoft SQL Server 2005のストアドプロシージャに3つのselectステートメントをコーディングしました。両方のselectステートメントは、複数のレコードとselectステートメントのテーブルリストを返します異なります。 1つはマスタテーブルからのレコード、もう1つは子テーブルからのレコードです。 C#のコードでは、これらのレコードをすべて取得し、すべてのデータを1つのオブジェクトに入れたいと考えています。私はSqlDataReaderを使用しています。それで可能か、他に何かするべきか?ストアドプロシージャ内に複数のselectステートメントがある場合のSqlDataReaderの使用方法

答えて

17

クエリから複数の結果を使用してナビゲートするには、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回だけ検索するように最適化できます。しかし、結果セットが小さい場合、利益はそれほど大きくはありません。

+0

丁寧に回答していますが、質問の一部を未回答のまま残していると思います。 ;-) – Cerebrus

2

...私はこのすべてのレコードを取得したいと一つのオブジェクトに このすべてのデータを入れてC#コード .INマスタテーブル と子テーブルから他の1つの選択を記録...

Peterのソリューションは、複数の結果を単一のDataReaderで取得するという基本的な問題を解決するために機能します。ただし、マスター - 詳細テーブル間の関係を複製するオブジェクトにデータを保存する場合は、代わりにDataSetを使用する必要があります。

DataSetsには複数のDataTableを含めることができ、テーブル間にDataRelationの作成を許可することで、テーブル間の固有の関係を完全にサポートできます。次に、マスタまたは詳細テーブルからそれぞれGetChildRows()またはGetParentRows()を呼び出すことによって、各シナリオの関連レコードを取得できます。

おそらくこれを行う方法を説明するサンプルがオンラインに多数あります。 Here's one discussion thread私のグループから私はステップをリストアップし、プロシージャを示すためのコードをいくつか提供しました。

+0

ありがとうございます。今、私が始めたことを終えました:) –

関連する問題