Microsoft SQL Server 2005 のストアド プロシージャに 3 つの select ステートメントをコーディングしました。両方の select ステートメントが複数のレコードを返し、select ステートメントのテーブル リストが異なります。1 つはマスター テーブルからレコードを選択し、もう 1 つは子テーブルからレコードを選択します。C# コードでは、これらすべてのレコードを取得し、すべてのデータを 1 つのオブジェクトに配置したいと考えています。SqlDataReader を使用しています。それは可能ですか、それとも何か他のことをする必要がありますか。
2 に答える
データリーダーで NextResultメソッドを使用して、クエリからの複数の結果をナビゲートします。
すべてのデータをループするには、次のようにします。
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{....});
}
明らかに、列名をデータにあるものに置き換え、Master オブジェクトと Detail オブジェクトの完全な初期化を提供する必要があります。詳細結果セットがマスター ID でソートされている場合、最後のループを最適化して、ディクショナリから各マスターを 1 回だけ検索することができます。ただし、結果セットが小さい場合、利益はそれほど大きくありません。
...マスターテーブルからレコードを選択し、子テーブルからレコードを選択します.C#コードでは、このすべてのレコードを取得し、このすべてのデータを1つのオブジェクトに配置したい...
Peter のソリューションは、1 つの .xml で複数の結果を取得するという基本的な問題を解決するために機能しDataReader
ます。ただし、Master-Details テーブル間の関係を複製するオブジェクトにデータを保存する場合は、代わりに を使用する必要がありますDataSet
。
DataSet には複数DataTable
の を含めることができ、テーブル間に を作成できるようにすることで、テーブル間の固有の関係を完全にサポートしDataRelation
ます。次に、マスター テーブルまたは詳細テーブルを呼び出すGetChildRows()
か、それぞれから、各シナリオの関連レコードを取得できます。GetParentRows()
これを行う方法を説明するサンプルは、おそらくオンラインに多数あります。これは、私のグループのディスカッション スレッドの 1 つです。ここでは、手順をリストし、手順を示すコードをいくつか提供しています。