2009-07-27 10 views
1

Ich verwende einen SqlDataReader, um eine Entität in einer Winform-App zu füllen. Die Entitätsklasse hat mehrere Fremdschlüsselattribute in der Datenbank, die ich als Eigenschaften in der Entitätsklasse einrichten möchte. Jede Eigenschaft hat den Typ 'Attribut' mit einer ID & Beschreibung Eigenschaft.Mehrere SQlCommand.ExecuteReader Aufrufe oder tun Sie es einmal mit Datenreader.NextResult()?

Einige der Benutzer des Systems sind weit entfernt von der Datenbank, so dass Datenzugriffsleistung eine ernsthafte Überlegung ist.

Ich konnte entweder den SqlCommand.ExecuteReader mehrmals (einmal für jedes Attribut) gegen eine gespeicherte Prozedur ausführen, die eine einzelne Ergebnismenge zurückgibt, oder ich konnte SqlCommand.ExecuteReader einmal für eine gespeicherte Prozedur ausführen, die mehrere Ergebnismengen zurückgibt und verwendet SqlDataReader.NextResult, um durch sie zu navigieren und die Attribute einzurichten.

Wenn ich mit .NextResult durchlaufen, bekomme ich einige Probleme mit der Sicherstellung, dass die gespeicherten Proc und die Eigenschaftszuweisung Schleifen ausgerichtet sind. Wenn die Reihenfolge der SELECT-Anweisungen in der proc-Reihenfolge geändert wird, würde die Zuordnungsreihenfolge in der winform-App durcheinander geraten.

Wenn der SqlDataReader für jeden Lesevorgang in die Datenbank zurückkehrt, wird viel Zeit zum Ausführen des SqlCommand.ExecuteReader hinzugefügt? Wenn Sie für jedes Attribut einen ExecuteReader ausführen, werden die Dinge auf der Zuordnungsseite klarer.

Danke!

Antwort

1

Mit .Nextresult kehrt ADO.Net nicht für jede Ergebnismenge in die Datenbank zurück. All diese Logik findet sich im ADO.Net-Datenprovider, wo immer er ausgeführt wird (in Ihrer Datenzugriffsebene, wahrscheinlich auf Ihrem Anwendungsserver oder in Ihrer UI-Schicht, wo auch immer)

Wenn Sie den Datenreader mehrmals ausführen, Sie werden jedoch für jeden Anruf eine Verbindung zur Datenbank herstellen. Wenn also der Layer, auf dem dieser Code ausgeführt wird, eine gewisse Entfernung (in der Umlaufzeit) von der DB entfernt ist, wäre es besser, die .NextResult-Technik zu verwenden.

Sie sollten auch in Betracht ziehen, ein DataSet (mit mehreren DataTables) anstelle eines Datenlesers zu verwenden .... Sie könnten dies leistungsfähiger finden.

+2

Ich bin gespannt: Wann wäre die Verwendung eines DataSet (mit DataAdapter) "performanter" als mit einem DataReader? Da der DataAdapter den darunter liegenden DataReader verwendet, frage ich mich, welche mystische Magie den DataAdapter schneller ausführen lässt, aber nicht den Endcode des Benutzers? –

+0

Um ehrlich zu sein, bin ich mir nicht ganz sicher, aber (und das folgende ist eine Vermutung) könnte es sein, weil der Code im ADO.Net-Provider, der das Dataset mit Daten "füllt", optimiert ist (vielleicht in C++/Assembly geschrieben) ?), um es schnell zu tun und dann von der Datenbank zu trennen, während wenn Sie einen Datenreader verwenden, müssen Sie diesen Code selbst schreiben, mit Aufruf von Std CLR-Framework-Klassen, und Ihr Code kann nicht trennen, bis es das letzte gelesen und verbraucht hat record in the reader ... –

+0

Und für jede Anwendung, die möglicherweise mehrere DB-Verbindungen erstellt, was die Skalierbarkeit am meisten beeinflusst, ist nicht das, was die Verbindungen tun, sondern wie lange sie offen bleiben. –