DataReader oder DataSet beim ziehen mehrere recordsets in ASP.NET
Habe ich eine ASP.NET Seite, hat eine Reihe von Steuerelementen, die aufgefüllt werden müssen (z.B. dropdown-Listen).
Ich würde gerne eine einzige Reise in die db zurück bringen und mehrere recordsets statt, die eine round-trip-für jedes Steuerelement.
Ich könnte zurück zu bringen mehrere Tabellen in ein DataSet, oder ich könnte zurück zu bringen DataReader-Objekt und verwenden".NextResult', jedes Ergebnis in einer benutzerdefinierten business-Klasse.
Werde ich wahrscheinlich sehen, einen ausreichend großen performance-Vorteil mit dem DataReader-Ansatz, oder sollte ich einfach das DataSet-Konzept?
Beispiele dafür, wie Sie in der Regel behandeln diese würde geschätzt.
InformationsquelleAutor GernBlandston | 2008-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
benutzerdefinierte speichern und benutzerdefinierte paging
"Für GridView"
Ihre Datenbank jedes mal, die Seite
genannt.
Dann denke ich, dass das besser ist die Verwendung von DataReader.
sonst
die Speicherung und paging "Für
GridView"
stress.
Datenbank nur ein mal und erhalten die
Vorteile von Caching.
Dann denke ich, die bessere, ist die Verwendung DataSet.
Hüpfe ich, dass ich Recht habe.
InformationsquelleAutor Wahid Bitar
Immer Ihre Daten in Klassen definiert, die für die spezifische Nutzung. Don ' T-pass-DataSets, DataReaders oder rund.
Tun Sie es nicht! Don ' T pass 'em um! Schauder
Von hart verdienten Erfahrung. NIE, NIE, NIE. Es sei denn, du machst einen sehr throw-away-Prototypen. Ich Lebe mit unreusable datasets Fliegen alle über dem Platz. Am Anfang, Sie scheinen wie eine gute Idee (hey, es ist lighning-Entwicklung!!), aber Sie sind geworden ein ziehen, sobald Sie versuchen, zu erhalten oder zu bauen/erweitern. Einnahme 30 Minuten mehr schreiben, die Klassen für die Daten zahlt almosts sofort (unit-Tests, anyone?).
das war für d03boy.
InformationsquelleAutor Carlton Jenke
Wenn Ihre gespeicherte Prozedur gibt ein paar Sätze, die das DataReader verwenden.NextResult zu fördern, um das nächste Stück von Daten. Auf diese Weise können Sie alle Ihre Daten, laden Sie es, um Ihre Objekte, und schließen Sie den reader so schnell wie möglich. Dies wird die Schnellste Methode, um Ihre Daten zu.
InformationsquelleAutor David Robbins
Sehen, dass keine Antwort markiert wurde obwohl es gibt plently gute Antworten bereits, ich dachte, ich würde hinzufügen, indem zwei bits als gut.
Ich würde verwenden DataReaders, als Sie ein bisschen schneller (wenn Leistung ist Ihr Ding oder Sie müssen so viel wie Sie bekommen können). Die meisten Projekte, die ich gearbeitet habe, haben Millionen von Datensätzen in einzelnen Tabellen und die Leistung sorgen.
Einige Leute haben gesagt, es ist nicht eine gute Idee, senden Sie DataReader in den verschiedenen Ebenen. Ich persönlich sehe das nicht als ein problem, da eine "DbDataReader" ist technisch nicht gebunden (oder nicht) in einer Datenbank. Das heißt, Sie können erstellen Sie eine Instanz von einem DbDataReader, ohne die Notwendigkeit für eine Datenbank.
Warum ich das mache ist es aus den folgenden Gründen:
Häufig (in einer Webanwendung), die Sie generieren, entweder im Html-oder Xml-oder JSON oder eine andere transformation Ihrer Daten. Warum also gehen Sie von einem DaraReader einige POCO-Objekt nur, um es zu transformieren zurück in das XML-oder JSON und senden Sie es nach unten den Draht. Diese Art von Prozess erfordert in der Regel 3-Transformationen und eine boot-Belastung von Objekt-Instanzen nur zu werfen Sie Weg fast sofort.
In manchen Situationen ist das in Ordnung oder kann nicht geholfen werden. Meine Daten-Schicht in der Regel Flächen zwei Methoden für jede gespeicherte Prozedur, die ich in das system haben. Man gibt ein DbDataReader und die andere gibt ein DataSet/DataTable. Die Methoden, die eine DataSet/DataTable rufen Sie die Methode der Rückkehr ein DbDataReader und nutzt dann entweder die "Load" - Methode des DataTable-oder ein adapter um das dataset zu füllen. Manchmal müssen Sie DataSets, da Sie wahrscheinlich haben, um die Wiederverwendung der Daten in einige Weg, oder Sie müssen, um das Feuer einer anderen Abfrage und unnless Sie haben MARS aktiviert, Sie können nicht ein DbDataReader öffnen und Feuer-eine andere Abfrage.
Nun gibt es einige Probleme bei der Verwendung DbDataReader oder DataSet/DataTable und das ist in der Regel code, der Klarheit, compile-Zeit-Prüfung etc. Sie können wrapper-Klassen für datareader und in der Tat können Sie Ihre DataReaders ein IEnumerable mit Ihnen. Wirklich Coole Fähigkeit. So erhalten Sie nicht nur starke Typisierung und die Lesbarkeit des Codes erhalten Sie auch IEnumerable!
So eine Klasse könnte wie folgt Aussehen.
DataReader-Wrapper
Habe ich einen blog-post (link oben) , geht in viel mehr detail und ich werden so ein source-code-generator für diese und andere DataAccess-layer code.
Können Sie verwenden die gleiche Technik für DataTables (der code-generator erzeugt den code), so können Sie behandeln Sie so, wie stark typisierte DataTable, ohne den overhead von dem, was VS.NET bietet out of the box.
Beachten Sie, dass es nur eine Instanz der wrapper-Klasse. Sie sind also nicht Hunderte von Instanzen einer Klasse nur, um es wegzuwerfen.
Versuchen Sie die Einnahme dieses auf die nächste Stufe und das einwickeln der datareader-Objekt mit iterator-block, liefert Sie eine
IEnumerable<IDataRecord>
. Lassen Sie Ihre Abfrage-Ergebnisse mit linq sofort.Joel, wenn Sie Blick auf meine blog-post, werden Sie sehen, dass ich zeigen, wie es auch zu tun :). In der Tat, was ich mit meinem meiner Projekte geht ein paar Schritte weiter können Sie in die gleiche Klasse wie ein POCO, so können Sie ein List<T> (wenn Sie müssen) oder verwenden Sie es als ein wrapper.
Aktualisiert link: matlus.com/datareader-wrappers-typesafe
InformationsquelleAutor Shiv Kumar
Karte die DataReader-intermediate-Objekte und binden Sie Ihre Kontrollen über diese Objekte. Es kann sein ok für die Verwendung von DataSets in bestimmten Umständen, aber diejenigen sind wenige und weit zwischen, wenn Sie starke Gründe für eine "nur Daten". Was auch immer Sie tun, don ' T pass ein DataReader-Objekt, um die Steuerelemente zu binden aus (nicht, dass Sie sagte, dass Sie waren, wenn man bedenkt, dass).
Meine persönliche Präferenz wäre die Verwendung eines ORM, aber wenn Sie gehen, um mit der hand Rollen Sie Ihre Daten Zugriff, ich denke, Sie sollten lieber mapping DataReaders auf Objekte gegenüber der Verwendung von DataSets. Mit Hilfe der .NextResult als eine Möglichkeit, sich selbst zu begrenzen durch den Aufprall auf die Datenbank mehrere Male ist ein zweischneidiges Schwert jedoch so wählen Sie mit bedacht. Sie finden sich wiederholen, wenn Sie versuchen, zu erstellen procs, die immer schnappen Sie sich genau, was Sie brauchen, mit nur einem Aufruf an die Datenbank. Wenn Ihre Anwendung nur ein paar Seiten, ist es wahrscheinlich OK, aber die Dinge außer Kontrolle geraten kann schnell. Ich persönlich hätte lieber einen proc pro Objekt-Typ und drücken Sie dann die Datenbank mehrere Male (einmal für jedes Objekt-Typ), um die Wartbarkeit zu maximieren. Dies ist, wo ein ORM scheint da ein guter wird eine Sql generiert, dass Sie erhalten genau das, was Sie wollen mit einem Aufruf in den meisten Fällen.
Ich Stimmte im Allgemeinen, was ist der Grund, warum ich in der Regel Karte bis mittleren Objekten. Ich hätte lieber den Aufwand der Zuordnung zu DTOs als das halten einer Verbindung offen, während die Bindung an mehrere Steuerelemente. Auch die übergabe DataReaders durch Ebenen ist böse, so die Allgemeine design-Richtlinien sind gegen die Bindung an einen DataReader
Um es klarzustellen: Meine Reihenfolge der Präferenz: 1) Binden von Objekten 2) Binden an DataSet/Table/Adapter 3) Binden direkt an datareader (tun Sie es nicht!).
InformationsquelleAutor Daniel Auger
Wenn Sie sind nicht daran interessiert, die Aktualisierung oder das löschen der Datensätze aus der Datenbank geholt, würde ich vorschlagen, mit Hilfe von DataReader. Im Grunde DataSet intern verwendet mehrere Datareaders, so DataReader sollte Ihnen gute performance-Vorteil.
InformationsquelleAutor Vijesh VP
In fast jeder situation
DataReader
s die beste Lösung für das Lesen aus einer Datenbank.DataReader
s sind schneller und weniger Speicher benötigen, alsDataTable
s oderDataSet
s.Auch
DataSet
s kann oft zu Situationen führen, in denen der OO-Modell ist gebrochen. Es ist nicht sehr objektorientiert vorbei um relationale Daten/schemata anstelle von Objekten, die wissen, wie zu manipulieren, dass die Daten.So, Erweiterbarkeit, Skalierbarkeit, Modularität und performance-Gründen immer
DataReader
s, wenn Sie sich selbst betrachten ein Echter Programmierer™ 😉Überprüfen Sie die links für die Fakten und die Diskussion über die zwei in der Praxis und Theorie.
InformationsquelleAutor wprl
Unabhängig davon, ob Sie abholen ein einzelnes Ergebnis oder mehrere Ergebnis-sets, der Konsens scheint zu sein, verwenden Sie ein DataReader-Objekt anstelle eines DataSet.
In Bezug auf ob sollten Sie immer Mühe mit mehrere Ergebnis-sets, die Weisheit ist, dass Sie sollten nicht, aber ich kann mir vorstellen, dass eine vernünftige Klasse von Ausnahmen zu dieser Regel: (fest) Bezug Ergebnis-sets. Sie sicherlich nicht wollen, um eine Abfrage hinzufügen, um wieder den gleichen Satz von Auswahlmöglichkeiten für ein drop-down-Liste, der wiederholt auf Hunderte oder sogar Dutzende von Seiten in Ihrer app, sondern mehrere Sätze eng-verwendet werden können, sinnvoll kombiniert. Als Beispiel, ich bin derzeit auf der Erstellung einer Seite für die Anzeige mehrerer Sätze von 'Diskrepanzen' für eine batch-ETL-data. Keine dieser Abfragen sind wahrscheinlich verwendet werden, an anderer Stelle, so wäre es sinnvoll zu Kapseln, Sie als ein einziges 'Diskrepanzen' sproc. Auf der anderen Seite, die eine bessere performance zu tun, so unbedeutend im Vergleich zu der Arbeit-rund um die Natürliche ein-sproc-one-result-set-Architektur Ihrer ORM oder von hand gerollt Daten-Zugriff-code.
InformationsquelleAutor Kenny Evitt
Habe ich gegangen, um eine Methode, die verwendet DataReaders für alle Anrufe, ich habe bemerkt einen deutlichen performance impovement, insbesondere in Fällen, wenn ich bin laden drop-down-Listen, und andere einfache Elemente, wie die.
Persönlich mit mehreren drop downs habe ich in der Regel gehen Sie zu pullling einzelnen Datenblöcke, um es zu bekommen, anstatt zu sagen, eine gespeicherte Prozedur zurückgibt, 5 Ergebnis-sets.
InformationsquelleAutor Mitchel Sellers
Werfen Sie einen Blick in die TableAdapters verfügbar sind .NET 2.0-und. Was Sie tun, ist geben Sie die Stärke der stark-typisierte DataTable und ermöglichen Ihnen das zuordnen einer Fill-Methode, um es und verwenden Sie ein DataReader-Objekt, um es zu laden. Ihre fill-Methode werden bestehende gespeicherte Prozeduren, Ihre eigenen ad-hoc-SQL, oder lassen auch die Assistenten generieren AdHod oder eine Gespeicherte Prozedur für Sie.
Finden Sie diese, indem Sie ein neues XSD-DataSet-Objekt in Ihrem Projekt. Für Tabellen, die verwendet werden, für mehr als nur lookup können Sie auch anzeigen insert/update/delete-Methoden, um die TableAdapter.
InformationsquelleAutor Dillie-O