Fonction qui renvoie la valeur maximale dans un DataReader [Résolu]

Signaler
Messages postés
3
Date d'inscription
dimanche 27 septembre 2009
Statut
Membre
Dernière intervention
11 juin 2012
-
Messages postés
2
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011
-
Salut, j'ai une base de données de deux tables (Famille, Produit). Je veux avoir la famille qui a le plus grand nombre de produit en utilisant une requête avec DataReader. J'ai exécuté cette méthode mais, elle renvoie toujours 0 pourtant que ma base est remplit:

public Int32 nbmax_produit()
{
string requete = "select count(*) from produit group by codeF";
try
{

SqlCommand myCommand = new SqlCommand(requete, CnxBase.myConn);
myCommand.Transaction = CnxBase.trans;
SqlDataReader myReader = myCommand.ExecuteReader();

int max=0;
int j = 0;
while (myReader.Read())
{

for(int i=1;i<myReader.FieldCount;i++)
{
if (Convert.ToInt32(myReader[i]) >= Convert.ToInt32(myReader[j]))
{
max = Convert.ToInt32(myReader[i]);
}
else
{
max = Convert.ToInt32(myReader[j]);
}

j++;
}
}
myReader.Close();
return max;

}

5 réponses

Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
Bien le bonjour,

Je pense que le problème vient de ta compréhension de la méthode myReader.Read(). En effet, cette méthode charge dans myReader l'entièreté de la ligne courante.
De ce fait, il y a donc 3 erreurs à ton code:
[list]
[*] 1. Il faut charger, dans l'objet reader, les lignes les unes après les autres.
[*] 2. La condition de vérification si la valeur maximum est dépassée doit être adaptée.
[*] 3. L'index appliqué à myReader doit toujours être 0 car tu ne récupère qu'une colonne (le résultat du count par des produits par famille).
/list
On obtient alors un code bien plus simple que voici:
int max = 0;
int j = 0;
while (myReader.Read())
{
   if (Convert.ToInt32(myReader[0]) > max)
   {
       max = Convert.ToInt32(myReader[0]);
   }                    
}


Il est important de noter que si tu peux avoir des valeurs négatives, il ne faut pas mettre max à 0 mais bien à Int32.MinValue par exemple.

Shao.
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
Bonsoir

Bien que le code de Shao soit parfait,
dans ton cas le mieux serait tout de même de faire faire le calcul par le moteur SQL qui sera plus rapide qu'une itération.

ex sur la base nothwind, pour récuperer le nombre de produit le plus élévé referencé par un fournisseur
SELECT TOP 1 COUNT(*) AS productCount FROM Products GROUP BY SupplierID ORDER BY COUNT(*) DESC

ensuite dans ton code, utilise la methode ExecuteScalar() pour avoir directement le résultat.


Bon code
Bob

C# is amazing, enjoy it!
Messages postés
2
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011

Bonjour,

en fait je vois bien que le sujet est bouclée mais j'ai le meme soucis cad que ma table n'est pas vide mais le resultat de ma datareder est null
avez vous une idée?
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
@heypart : a priori, DataReader null -> requête erronée.
Un DataReader pointant vers une sélection vide n'étant pas null.
Messages postés
2
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011

re..

le probleme vient en fait de ma connexion... a suivre