Wie zähle ich die Anzahl der zurückgegebenen Zeilen in meinem SQLite-reader in C#?
Arbeite ich in Microsoft Visual C# 2008 Express und mit SQLite.
Ich bin der Abfrage meiner Datenbank mit so etwas wie dies:
SQLiteCommand cmd = new SQLiteCommand(conn);
cmd.CommandText = "select id from myTable where word = '" + word + "';";
cmd.CommandType = CommandType.Text;
SQLiteDataReader reader = cmd.ExecuteReader();
Dann habe ich etwas wie das hier tun:
if (reader.HasRows == true) {
while (reader.Read()) {
//I do stuff here
}
}
Was ich tun möchte, ist count die Anzahl der Zeilen vor ich tun " - Leser.Read()" da sich die Anzahl wieder auf das, was ich will/brauche. Ich weiß, ich kann eine Zählung innerhalb der while-Anweisung, aber ich wirklich wissen müssen, um die Zählung vor.
Irgendwelche Vorschläge?
InformationsquelleAutor adeena | 2009-06-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den DataReader läuft träge, so dass es nicht abholen das gesamte rowset, bevor Sie beginnen. Dies lässt Sie mit zwei Optionen:
Weil ich bin eher so der SQL-Typ, mache ich den count in der SQL-Anweisung:
Hinweis, wie ich gezählt * und nicht die id in der Anfang. Dies ist, weil count(id) ignoriert-id ' s, während count(*) wird nur komplett ignorieren null-Zeilen. Wenn Sie keine null-id ' s, dann verwenden Sie count(id) (es ist ein Tick schneller, je nach Tischgröße).
Update: Geändert, ExecuteScalar, und auch count(id) basiert auf Kommentare.
oh - und "id" wird nie null sein. Wenn es ist, ist etwas anderes falsch. 🙂
Wie groß ist "SEHR groß" und sind Sie sicher, dass SQLite ist das beste?
Für den moment, da Lerne ich während dem Programmieren, ich bin mir sicher, dass SQlite ist das beste für jetzt. Werde ich ändern müssen, um zu einer anderen Datenbank, die Lösung in der Zukunft? Es ist wahrscheinlich, - aber ich habe so viel andere Dinge zu lernen und zu tun, dass SQLite ist derzeit meine Bedürfnisse erfüllt. Dieser Tabelle werden ein paar tausend Einträge in der Nähe von Begriff, aber wenn mein Antrag ist fertig und ich bin mit ihn voll, es sollte mindestens 60.000 und so viel wie 100.000
Dies ist nicht direkt mit der Frage, aber ich würde empfehlen, nicht mit der Verkettung von Strings zum erstellen der sql string ist, verwenden Sie stattdessen einen parametrisierten Abfrage, um zu verhindern, dass vor möglichen sql-injection.
InformationsquelleAutor Eric
Nicht eine zweite Abfrage:
Ihre Leser enthält dann eine einzelne Zeile mit einer Spalte, die die Anzahl der Zeilen in der Ergebnismenge. Die Zählung durchgeführt wurden, auf dem server, so sollte es sein, schön schnell.
Für eine Anzahl, dann sollte man eher verwenden ExecuteScalar als ExecuteReader...
Absolut. Generell würde ich hoffe, dass es ein Feld namens "id" ist NICHT NULL, aber Sie können nie sicher sein!
InformationsquelleAutor Jeremy McGee
Was Sie verlangen, ist nicht machbar-zu zitieren,Igor Tandetnik, mein Schwerpunkt:
(
sqlite3_step
ist die Funktion in SQLite-s-C-API, C# - Schnittstelle ruft hier für jede Zeile im Ergebnis).Könnte man lieber eine
"SELECT COUNT(*) from myTable where word = '" + word + "';"
ersten, bevor Sie Ihre "echte" Abfrage -- , dass wird Ihnen sagen, wie viele Zeilen, die Sie gehen, um von der real-Abfrage.InformationsquelleAutor Alex Martelli
Wenn Sie nur laden ein
id
Spalte aus der Datenbank, wäre es nicht einfacher, einfach laden in einerList<string>
und dann von dort aus arbeiten im Speicher?Es hängt davon ab, was das "ich mache Sachen, die hier' ist... je nach Algorithmus die meisten/alle Daten bis Ende Mai in den Speicher sowieso.
Beachten Sie auch, dass in einem anderen Kommentar wird der Absender gibt an, dass in der Regel so etwas wie 10 Zeilen erwartet wird, aus der Abfrage, so eine Liste wird wohl schneller sein als zwei round-trips zur Datenbank.
InformationsquelleAutor jerryjvl
Normalerweise würde ich tun
um das Ergebnis so schnell wie möglich. In dem Fall, wo die id ist ein int, dann wird es nicht viel Unterschied. Wenn es etwas größeres wie ein string-Typ, dann werden Sie einen Unterschied bemerken, die über einen großen Datenbestand.
Argumentation über es zählen(1) die null-Zeilen. Aber ich bin bereit, korrigiert zu werden, wenn ich bin falsch.
InformationsquelleAutor Ed Sykes
Warum ist das so ? dies ist in der Regel nicht notwendig, wenn Sie die geeignete in-memory-Datenstrukturen (Datasets,...). Es ist wahrscheinlich ein Weg, das zu tun, was Sie wollen, die nicht erforderlich ist, zählen die Zeilen vorher.
Konnte Sie abrufen, alle Zeilen in eine Liste oder ein Datensatz, dann überprüfen Sie die Anzahl der Zeilen und tun, was Sie tun müssen, um auf die in-memory-Daten, gemäß der Anzahl der Zeilen. Es sei denn, die Abfrage ist wahrscheinlich zu Holen, die Hunderte oder Tausende von Zeilen, dass sollte nicht das problem sein.
InformationsquelleAutor Thomas Levesque
Sie zu rechnen haben, mit
select count... from...
Damit wird Ihre Anwendung langsamer. Es gibt jedoch eine einfache Möglichkeit, um Ihre app schneller und so ist die Verwendung von parametrisierten Abfragen.
Siehe hier: Wie bekomme ich das "" problem in sqlite und c#?
(Also neben der Geschwindigkeit parametrisierte Abfragen haben 2 andere Vorteile.)
InformationsquelleAutor tuinstoel
Versuchen, diese,
total_rows_in_resultset gibt Sie die Anzahl der Zeilen in der Ergebnismenge, die nach der Verarbeitung der Abfrage
denken Sie daran, dass, wenn Sie wollen, verwenden Sie die gleichen reader schließen Sie dann das Lesegerät und starten Sie es erneut.
InformationsquelleAutor Anokha Ladla
InformationsquelleAutor Eros Ar
Sicherlich eine bessere Methode, um eine Zeile zu zählen wäre so etwas wie dieses:-
So dass Sie nicht haben, Durchlaufen Sie die Zeilen
InformationsquelleAutor Pete