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

Messages postés
3
Date d'inscription
dimanche 27 septembre 2009
Dernière intervention
11 juin 2012
- 15 nov. 2010 à 15:12 - Dernière réponse :
Messages postés
2
Date d'inscription
mercredi 30 mars 2011
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;

}
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Dernière intervention
8 mars 2011
- 15 nov. 2010 à 15:40
3
Merci
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.

Merci Shaolyne 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Shaolyne
Meilleure réponse
Messages postés
835
Date d'inscription
samedi 15 novembre 2008
Dernière intervention
14 janvier 2017
- 17 nov. 2010 à 21:21
3
Merci
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!

Merci cs_Robert33 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

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

le probleme vient en fait de ma connexion... a suivre
Commenter la réponse de heypart

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.