Comment compter le nombre de lignes retournées dans mon lecteur SQLite en C #?
Je travaille dans Microsoft Visual C# 2008 Express et avec SQLite.
J'interroge ma base de données avec quelque chose comme ceci:
SQLiteCommand cmd = new SQLiteCommand(conn);
cmd.CommandText = "select id from myTable where word = '" + word + "';";
cmd.CommandType = CommandType.Text;
SQLiteDataReader reader = cmd.ExecuteReader();
Puis-je faire quelque chose comme ceci:
if (reader.HasRows == true) {
while (reader.Read()) {
//I do stuff here
}
}
Ce que je veux faire est de compter le nombre de lignes avant je ne "lecteur.Read ()", car le nombre retourné affectera ce que je veux/dois faire. Je sais que je peux ajouter un nombre à l'intérieur de l'instruction while, mais j'ai vraiment besoin de savoir le nombre.
Des suggestions?
source d'informationauteur adeena | 2009-06-07
Vous devez vous connecter pour publier un commentaire.
Le DataReader tourne paresseusement, afin de ne pas ramasser la totalité de l'ensemble de lignes avant de commencer. Cela vous laisse deux choix:
Parce que je suis de plus en plus de une SQL gars, je vais faire le décompte dans l'instruction SQL:
Remarque comment j'ai compté *, pas d'id dans le début. C'est parce que count(id) ignorera id, count(*) ignore complètement les lignes nulles. Si vous n'avez pas null id, puis utilisez la fonction count(id) (c'est un tantinet plus rapide, en fonction de votre taille de la table).
Mise à jour: modification ExecuteScalar, et également count(id) sur la base des commentaires.
Faire une deuxième requête:
Votre lecteur va alors contenir une seule ligne avec une colonne contenant le nombre de lignes dans le jeu de résultats. Le décompte a été effectuée sur le serveur, donc il doit être bien rapide.
Ce que vous demandez n'est pas possible-pour citer Igor Tandetnikmon accent:
(
sqlite3_step
est la fonction dans SQLite, l'API C que le C# interface appelle ici, pour chaque ligne dans le résultat).Vous pourrait plutôt faire un
"SELECT COUNT(*) from myTable where word = '" + word + "';"
tout d'abord, avant que votre "réel" de la requête -- que vous indiquera le nombre de lignes que vous allez obtenir de la vraie requête.Si vous êtes seulement de chargement d'un
id
colonne à partir de la base de données, ne serait-il pas plus simple de charger dans unList<string>
et ensuite travailler à partir de là dans la mémoire?Normalement, je devrais faire
pour obtenir le résultat le plus vite possible. Dans le cas où id est un int alors il ne fera pas beaucoup de différence. Si c'était quelque chose d'un peu plus grand comme un type de chaîne puis vous remarquerez une différence sur un grand ensemble de données.
Raisonnement sur le compte(1) comprend les lignes nulles. Mais je suis prêt à être corrigé si je me trompe à ce sujet.
Pourquoi est-ce ? ce n'est généralement pas nécessaire, si vous utiliser des structures de données en mémoire (Dataset, Liste...). Il y a sans doute une façon de faire ce que vous voulez qui ne nécessite pas de compter les lignes à l'avance.
Vous ne devez compter avec
select count... from...
Cela permettra de rendre votre application plus lente. Cependant, il existe un moyen facile de rendre votre application plus rapide et que la façon est d'utiliser des requêtes paramétrées.
Voir ici: Comment puis-je contourner le "problème" dans sqlite et c#?
(Donc en plus de la vitesse des requêtes paramétrées avoir 2 d'autres avantages aussi.)
Essayer cela,
total_rows_in_resultset vous donne le nombre de lignes dans le jeu de résultat après le traitement de la requête
n'oubliez pas que si vous voulez utiliser le même lecteur puis fermez ce lecteur et de le démarrer à nouveau.
Sûrement une meilleure façon d'obtenir un nombre de lignes serait quelque chose comme ceci:-
De cette façon, vous n'avez pas à parcourir les lignes