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

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

5 réponses

Répondre au sujet
Shaolyne 155 Messages postés jeudi 12 mai 2005Date d'inscription 8 mars 2011 Dernière intervention - 15 nov. 2010 à 15:40
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Shaolyne
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 17 nov. 2010 à 21:21
+3
Utile
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!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Robert33
heypart 2 Messages postés mercredi 30 mars 2011Date d'inscription 30 mars 2011 Dernière intervention - 30 mars 2011 à 11:34
0
Utile
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
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 30 mars 2011 à 11:56
0
Utile
@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
heypart 2 Messages postés mercredi 30 mars 2011Date d'inscription 30 mars 2011 Dernière intervention - 30 mars 2011 à 16:23
0
Utile
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.