3 Stimmen

Zweimal durch einen DataReader iterieren

Ich muss zweimal durch einen DataReader iterieren. Gibt es eine Möglichkeit, dies zu tun, ohne DataSets zu verwenden und ohne die Abfrage zweimal auszuführen? Ich bin mit C#, übrigens.
Gracias

0 Stimmen

Warum versuchen Sie, DataSets zu vermeiden? Wenn es sich um ein Leistungsproblem handelt, sollten Sie sich das ItemArray der DataRow-Objekte ansehen. Die Verwendung von ItemArray anstelle des Spaltenindexers kann viel schneller sein.

0 Stimmen

Es sind mehrere hunderttausend Zeilen. Ich werde es mir ansehen, danke!

4voto

Will Charczuk Punkte 879

Die kurze Antwort lautet: Nein, Sie durchlaufen die Aufzählung für die Ergebnismengen, und dann sind Sie fertig. Was wahrscheinlich getan werden sollte, ist, um die Ergebnisse zu einer Art von vereinfachten Rohergebnisse, die Sie über so viel wie Sie wollen iterieren können (Vermeidung der Overhead des DataSet) Dump.

Werfen Sie einen Blick auf MSDN Es wird darauf hingewiesen, dass der SqlDataReader "nur vorwärts" ist, was wiederum bedeutet, dass dies nicht möglich ist.

0 Stimmen

Ich weiß, dass es nur vorwärts geht... Ich dachte nur, dass es vielleicht einen Weg gibt, das zu umgehen, aber danke!

4voto

Francisco Soto Punkte 10131

Es ist ein reines Vorwärtslesegerät, Sie können nicht zurückgehen. Ihre beste Wette ist, dass anstelle der Iteration zweimal die Daten-Leser, tun beide Operationen, die Sie in einer Iteration tun möchten.

Sie können die Ergebnisse selbst zwischenspeichern, aber das würde den Zweck des DataReaders zunichte machen. Wenn Sie die Daten also häufig benötigen, müssen Sie einen anderen Weg für den Zugriff wählen.

3voto

STO Punkte 9762

Das ist zwar möglich, aber nicht so einfach, da sich der Datenleser bei jedem Read()-Aufruf ändert. Sie müssen also die vorherigen Werte irgendwo speichern, um beim nächsten Mal darauf zugreifen zu können. Die Verwendung eines Datensatzes ist hier keine so schlechte Idee.

0voto

Scott Chamberlain Punkte 120610

El IDataReader Spezifikation erlaubt es nicht, die Liste zurückzusetzen, aber prüfen Sie, ob die spezifische Implementierung auch die IEnumerator oder hat eine GetEnumerator() Funktion gibt es einen Reset-Befehl als Teil dieser Schnittstelle.

0 Stimmen

Wenn die Reset-Methode bei dieser Klasse funktioniert und nicht nur eine NotImplementedException wird höchstwahrscheinlich die Datenbank neu abgefragt.

0voto

Jeff Punkte 9

Ich habe eine Lösung für dieses Problem, das ist vielleicht nicht die beste, aber ich habe dies viele Male ohne ein Problem. Sie können eine Unterabfrage in der Auswahlklausel erstellen, die angibt, wie viele Zeilen zurückgegeben werden sollen. Beispiel:

SELECT productid, 
  name, 
  price, 
  (SELECT COUNT(*) FROM tblProduct WHERE categoryid=1 AND price <= 1000) 
     AS 'RowCount' 
FROM tblProduct 
WHERE categoryid=1 AND price <= 1000;

0 Stimmen

Was hat das mit dieser Frage zu tun?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X