2009-02-26 15 views
3

Ich benutze C# und SQL Server 2005 und ich brauche eine Empfehlung zum Auffüllen meiner Objekte.C# mehrere Verbindungen vs Dataset

Ich habe eine Kundenkollektion, die eine Sammlung von Kundenobjekten enthält. Jedes Kundenobjekt enthält eine Orders-Sammlung mit einer Sammlung von Aufträgen.

Ich verwende eine öffentliche Fetch() - Methode für meine Kundensammlung, um die Kunden und ihre Bestellungen zu füllen.

Sie können nur einen DataReader pro Verbindung öffnen, rechts. Das würde bedeuten, dass ich eine Verbindung für den Leser 'SELECT * Customers' benötige, und während ich durch den Kundenleser iteriere, würde ich für jede 'SELECT * Orders WHERE CustomerId_fk = @Id' eine weitere Verbindung benötigen.

Meine Frage: Würden Sie mir empfehlen, den oben genannten Weg zu verwenden oder einfach DataSets?

EDIT

Ich hatte '* Kunden SELECT WHERE Id = @Id' anstelle von '* Kunden SELECT'.

Antwort

3

Eigentlich ist Ihre Behauptung ("Sie können nur einen DataReader pro Verbindung geöffnet haben") falsch. Sie können enable MARS (Mehrere aktive Resultsets) über eine Optimierung der Verbindungszeichenfolge und Arbeit erledigt; außer natürlich, dass du immer noch viele Rundreisen hast (n + 1).

Ich denke auch nicht, dass die unmittelbare Alternative Datasets ist. Persönlich würde ich zwei Ergebnisraster verwenden (entweder aus einer einzelnen Abfrage oder aus zwei Abfragen) und sie beim Aufrufer zusammenheften.

Alternativ können Sie LINQ-to-SQL mit LoadWith<Customer>(c=>c.Orders); (DataLoadOptions) verwenden. Auch ohne LoadWith wird das gleiche n + 1-Verhalten automatisch ausgeführt, indem einfach die Sammlung für jede Customer geladen wird (die Navigationseigenschaften werden standardmäßig träge geladen).

2

Ich würde wahrscheinlich einen SqlDataAdapter verwenden, um beide in einem Durchgang in ein DataSet abzufragen. Etwas wie folgt aus:

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

Dann hatte ich die Beziehung mit so etwas wie diese ein:

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

diese Weise werden Sie nur eine Verbindung öffnen, Sie alle Daten abfragen und dann eingestellt die Beziehung in Erinnerung.

0

Verdammt! Ich würde mir nur die Hand beißen und zwei Connections benutzen.

Denken Sie daran, sie und den Datenleser zu schließen.

Ich weiß nicht warum, ich kann mich einfach nicht dazu bringen, DataSet überall zu verwenden ...!

1

Ich werde nur auf Marcs Antwort erweitern. Ein DataReader kann mehrere Ergebnismengen gleichzeitig lesen. So können Sie folgendes tun:

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 
    } 

    } 
} 

Sie würden natürlich nur die benötigten Daten holen, aber Sie bekommen den Punkt. Dadurch können Sie beide Ergebnismengen mit einem Befehl abrufen.

+0

Dies deckt einen meiner Punkte (mehrere Raster von einem Befehl); Beachten Sie, dass der MARS-Punkt ein separates Problem ist; -p –

+0

MARS kann wirklich nützlich sein, aber hier denke ich nicht, dass es nötig ist –

Verwandte Themen