2009-02-26 18 views
3

私はC#とSQL Server 2005を使用しています。私はオブジェクトを作成する方法についての推奨が必要です。C#複数接続vsデータセット

顧客オブジェクトのコレクションを含むCustomersコレクションがあります。各顧客オブジェクトには、注文のコレクションを含む注文コレクションが含まれています。

私はCustomersとその注文を入力するために、Customersコレクションで公開Fetch()メソッドを使用します。

接続ごとに1つのDataReaderを開くことができます。つまり、「SELECT * Customers」の読者に1つの接続が必要であり、顧客の読者を繰り返している間に、「SELECT * Order Where WHERE CustomerId_fk = @Id」ごとに別の接続が必要です。

私の質問:私は上記の方法を使用するか、単純なDataSetsを使用することをお勧めしますか?

EDIT

私は 'ID = @Id *お客様のSELECT' の代わりに '*お客様のSELECT' でした。

答えて

3

実際に、アサーション(「1つの接続につき1つのDataReaderのみを開くことができます」)が間違っています。接続文字列を微調整してenable MARS(複数のアクティブな結果セット)を作成してジョブを完了できます。あなたにはまだ多くのラウンドトリップ(n + 1)があります。

私はまた、即時代替がデータセットではないとも考えています。個人的には、2つの結果グリッド(1つのクエリまたは2つのクエリのいずれか)を使用し、それらを一緒に呼び出し元に戻します。

また、LoadWith<Customer>(c=>c.Orders);DataLoadOptions)のLINQ-to-SQLのようなものを使用してください。 LoadWithがなくても、Customerのコレクションを読み込むだけで自動的に同じn + 1の動作が実行されます(ナビゲーションプロパティはデフォルトで遅延ロードされます)。

2

おそらくSqlDataAdapterを使用して、両方をクエリしてDataSetに渡します。このような何か:その後、私はこのようなものを使用して関係を設定するのだ

SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM CUSTOMERS WHERE CustomerId = @id; SELECT * FROM ORDERS WHERE CustomerId = @id",connection); 
adapter.Fill(dataSet); 

dataSet.Relations.Add(new DataRelation("relationName", dataSet.Tables[0].Columns["CustomerId"], dataSet.Tables[1].Columns["CustomerId"]); 

この方法は、あなたが唯一の接続を開き、あなたはすべてのデータを照会し、次に設定その関係を記憶に残す。

0

くそー!私はちょうど私の手を噛んで、2つの接続を使用します。

「em」と「datareader」を閉じてください。

私はなぜ、私はDataSetをどこにでも使用することはできません。

1

私はMarcsの答えを拡張します。 DataReaderは、複数の結果セットを同時に読み取ることができます。したがって、次の操作を行うことができます:

string sql = "SELECT * FROM Customers; SELECT * FROM Orders;"; 
using (SqlCommand cmd = new SqlCommand(sql, connection)) 
using (SqlDataReader rd = cmd.ExecuteReader()) 
{ 

    while (rd.Read()) 
    { 
    // Read customers 
    } 

    if (rd.NextResult()) // Change result set to Orders 
    { 
    while(rd.Read()) 
    { 
     // Read orders 
    } 

    } 
} 

もちろん、必要なデータだけを取り出すことはできますが、その点が分かります。これにより、1つのコマンドを使用して両方の結果セットを取得できます。

+0

これは私のポイント(1つのコマンドから複数のグリッド)をカバーしています。 MARSのポイントは別の問題であることに注意してください.-p –

+0

MARSは本当に便利ですが、ここでは必要ないと思います –

関連する問題