Ma question est de savoir comment obtenir le nombre de lignes renvoyées par une requête en utilisant SqlDataReader
en C #. J'ai vu quelques réponses à ce sujet, mais aucune n'a été clairement définie à l'exception de celle qui stipule de faire une boucle while avec une Read()
méthode et d'incrémenter un compteur.
Mon problème est que j'essaie de remplir un tableau multidimensionnel avec la première ligne étant les noms d'en-tête de colonne et chaque ligne après cela pour les données de ligne.
Je sais que je peux simplement vider le contenu dans un contrôle de liste et ne pas m'en soucier, mais pour ma propre édification personnelle et j'aimerais également extraire et extraire les données du tableau comme je le souhaite et l'afficher dans différents formats.
Je pense donc que je ne peux pas faire de la manière Read()
puis incrémenter ++ parce que cela signifie que je devrais ouvrir Read()
puis ouvrir à Read()
nouveau pour obtenir le nombre de lignes, puis les données de colonne.
Juste un petit exemple de ce dont je parle:
int counter = 0;
while (sqlRead.Read())
{
//get rows
counter++
}
puis une boucle for pour parcourir les colonnes et pop
something.Read();
int dbFields = sqlRead.FieldCount;
for (int i = 0; i < dbFields; i++)
{
// do stuff to array
}
la source
RepeatableRead
niveau d'isolement n'effectue pas de verrouillage de plage, il autorise donc toujours l'insertion d'enregistrements, vous devez utiliser un niveau d'isolement deSnapshot
ouSerializable
.Si vous n'avez pas besoin de récupérer toute la ligne et que vous voulez éviter de faire une double requête, vous pouvez probablement essayer quelque chose comme ça:
Vous devrez peut-être ajouter une transaction sans savoir si la réutilisation de la même commande ajoutera automatiquement une transaction dessus ...
la source
sqlCon.Close();
? J'ai pensé que çausing
devrait le faire pour toi.Comme ci-dessus, un ensemble de données ou un ensemble de données typé peut être une bonne structure provisoire que vous pouvez utiliser pour effectuer votre filtrage. Un SqlDataReader est destiné à lire les données très rapidement. Pendant que vous êtes dans la boucle while (), vous êtes toujours connecté à la base de données et il attend que vous fassiez tout ce que vous faites pour lire / traiter le résultat suivant avant de continuer. Dans ce cas, vous pouvez obtenir de meilleures performances si vous récupérez toutes les données, fermez la connexion à la base de données et traitez les résultats «hors ligne».
Les gens semblent détester les ensembles de données, donc ce qui précède pourrait également être fait avec une collection d'objets fortement typés.
la source
Vous ne pouvez pas obtenir un nombre de lignes directement à partir d'un lecteur de données, car il s'agit de ce que l'on appelle un curseur Firehose - ce qui signifie que les données sont lues ligne par ligne en fonction de la lecture effectuée. Je vous déconseille de faire 2 lectures sur les données car il est possible que les données aient changé entre les 2 lectures, et ainsi vous obtiendriez des résultats différents.
Ce que vous pouvez faire, c'est lire les données dans une structure temporaire et l'utiliser à la place de la deuxième lecture. Sinon, vous devrez changer le mécanisme par lequel vous récupérez les données et utilisez plutôt quelque chose comme un DataTable.
la source
pour compléter la réponse Pit et pour une meilleure performance: obtenez tout en une seule requête et utilisez la méthode NextResult.
la source
Je suis également confronté à une situation où je devais renvoyer un résultat supérieur, mais que je voulais également obtenir le nombre total de lignes correspondant à la requête. j'arrive enfin à cette solution:
la source