Meine Frage ist, wie man die Anzahl der von einer Abfrage zurückgegebenen Zeilen mit SqlDataReader
C # erhält . Ich habe einige Antworten dazu gesehen, aber keine war klar definiert, außer einer, die angibt, eine while-Schleife mit der Read()
Methode durchzuführen und einen Zähler zu erhöhen.
Mein Problem ist, dass ich versuche, ein mehrdimensionales Array zu füllen, wobei die erste Zeile die Spaltenüberschriften und jede Zeile danach die Zeilendaten sind.
Ich weiß, dass ich das Zeug einfach in ein List-Steuerelement kopieren kann und mich nicht darum kümmern muss, sondern für meine persönliche Bearbeitung, und ich möchte die Daten auch in das Array hinein- und herausziehen, während ich sie auswähle und in verschiedenen Formaten anzeige.
Also denke ich, ich kann das nicht tun Read()
und dann ++ inkrementieren, weil das bedeutet, dass ich öffnen Read()
und dann Read()
wieder öffnen müsste , um die Anzahl der Zeilen und dann die Spaltendaten zu erhalten.
Nur ein kleines Beispiel dafür, wovon ich spreche:
int counter = 0;
while (sqlRead.Read())
{
//get rows
counter++
}
und dann eine for-Schleife, um durch die Spalten zu laufen und zu popen
something.Read();
int dbFields = sqlRead.FieldCount;
for (int i = 0; i < dbFields; i++)
{
// do stuff to array
}
quelle
RepeatableRead
Isolationsstufe führt keine Bereichssperre durch, sodass weiterhin Datensätze eingefügt werden können. Sie müssen eine Isolationsstufe vonSnapshot
oder verwendenSerializable
.Wenn Sie nicht die gesamte Zeile abrufen müssen und keine doppelte Abfrage durchführen möchten, können Sie wahrscheinlich Folgendes versuchen:
Möglicherweise müssen Sie eine Transaktion hinzufügen, die nicht sicher ist, ob bei erneuter Verwendung desselben Befehls automatisch eine Transaktion hinzugefügt wird ...
quelle
sqlCon.Close();
? Ich dachte, dasusing
sollte es für dich tun.Wie oben beschrieben, kann ein Datensatz oder ein typisierter Datensatz eine gute temporäre Struktur sein, mit der Sie Ihre Filterung durchführen können. Ein SqlDataReader soll die Daten sehr schnell lesen. Während Sie sich in der while () - Schleife befinden, sind Sie immer noch mit der Datenbank verbunden und sie wartet darauf, dass Sie alles tun, was Sie tun, um das nächste Ergebnis zu lesen / verarbeiten, bevor es weitergeht. In diesem Fall erzielen Sie möglicherweise eine bessere Leistung, wenn Sie alle Daten abrufen, die Verbindung zur Datenbank schließen und die Ergebnisse "offline" verarbeiten.
Die Leute scheinen Datensätze zu hassen, daher könnte das oben Genannte auch mit einer Sammlung stark typisierter Objekte geschehen.
quelle
Sie können die Anzahl der Zeilen nicht direkt von einem Datenleser abrufen, da es sich um einen sogenannten Firehose-Cursor handelt. Dies bedeutet, dass die Daten zeilenweise basierend auf dem durchgeführten Lesevorgang gelesen werden. Ich würde davon abraten, zwei Lesevorgänge an den Daten durchzuführen, da sich die Daten möglicherweise zwischen den beiden Lesevorgängen geändert haben und Sie daher unterschiedliche Ergebnisse erhalten.
Sie können die Daten in eine temporäre Struktur einlesen und diese anstelle des zweiten Lesevorgangs verwenden. Alternativ müssen Sie den Mechanismus ändern, mit dem Sie die Daten abrufen, und stattdessen eine Datentabelle verwenden.
quelle
Um die Pit-Antwort zu vervollständigen und eine bessere Leistung zu erzielen, erhalten Sie alles in einer Abfrage und verwenden Sie die NextResult-Methode.
quelle
Ich habe auch eine Situation, in der ich ein Top-Ergebnis zurückgeben musste, aber auch die Gesamtzahl der Zeilen erhalten wollte, die mit der Abfrage übereinstimmen. Ich komme schließlich zu dieser Lösung:
quelle