Fonction qui renvoie la valeur maximale dans un DataReader

Résolu
medfourati
Messages postés
3
Date d'inscription
dimanche 27 septembre 2009
Statut
Membre
Dernière intervention
11 juin 2012
- 15 nov. 2010 à 15:12
heypart
Messages postés
2
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011
- 30 mars 2011 à 16:23
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

Shaolyne
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
15 nov. 2010 à 15:40
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.
3
cs_Robert33
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
32
17 nov. 2010 à 21:21
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!
3
heypart
Messages postés
2
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011

30 mars 2011 à 11:34
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?
0
cs_jopop
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
30 mars 2011 à 11:56
@heypart : a priori, DataReader null -> requête erronée.
Un DataReader pointant vers une sélection vide n'étant pas null.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
heypart
Messages postés
2
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011

30 mars 2011 à 16:23
re..

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