Requete sql visual studio c# retourne plusieurs fois la même

Résolu/Fermé
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022 - 21 sept. 2022 à 09:54
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022 - 8 nov. 2022 à 10:58

Bonjour,

Bonjour,
j'ai un programme c# qui prend un fichier en entrée et qui dois me créer un fichire excel en sortie.
Dans mon programme, j'execute une requete sql, mais dans le fichier excel en sortie, j'ai plusieurs fois la même ligne, je ne sais pas si je m'y prend bien dans mon programme c# pour faire ma requete sql, voici mon code :

repexc = folderBrowserDialog2.SelectedPath + "\\monfichier" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx";
-........
.........
//sirens est un tableau avec une liste de sirens
try
	{
		MySqlCommand cmd = new MySqlCommand();
 
 
		for (int a = 0; a < sirens.Count; a++)
		{
 
				 marequete = " select t1.NUMSIR  , " +   //1
					 "t1.CCOD, " +
					 "t0.MONtant,  " +
					 "t0.SOLDAT,  " +
					 "t0.ADHFER,  " + //5
					 "t1.numeroadh, " +
					 "t1.fichier, " +
					 "t1.RAISO2, " +
					 "t1.RAISOC, " +
					 "date_format(t1.debutdate, '%m/%d/%Y') , " + //10
					 "t1.FINDATe, " +
					 "t1.DATRECe, " +
					 "t1.EMITOTale, " +
					 "t2.EMILIBelle, " +
					 "t2.EMIBASe, " +
					 "t2.EMICOE, " +  //16
					 "t2.EMINETe,  " +
					 "t2.EMICOTisation,  " +
					 "t2.EMIMT, " +
					 "t3.ENCTOTale, " +  //20
					 "t3.ENCDEB, " +
					 "t3.ENCFIN " +
			 " from 000pf t0 " +
			 " left join Table001 t1 on t1.NUMSIR = t0.NUMSIR " + //rajout 
			 " left join Table002 t2 on  t1.NUMSIR = t2.NUMSIR  and t1.NOMFIC = t2.NOMFIC " + 
			 " left join Table003 t3 on t3.NUMSIR = t2.NUMSIR    " +		                                      
			" where t0.numsir = " + sirens[a] + "" +
			 " and t1.NOMFIC = '" + fichierEnEntrée + " '";
			;
 
			cmd = new MySqlCommand(marequete, conn);
 
			monreader = cmd.ExecuteReader();
 
			 if (monreader.Read()) //while                                            
			{
				//premier reader
				ws.Cells[cptCol, 1] = ReturnReaderValue(monreader, 0); 
				ws.Cells[cptCol, 2] = ReturnReaderValue(monreader, 1);                           
				ws.Cells[cptCol, 3] = ReturnReaderValue(monreader, 2); //SOLMON
				ws.Cells[cptCol, 4] = ReturnReaderValue(monreader, 3);  //SOLDAT 
				ws.Cells[cptCol, 5] = ReturnReaderValue(monreader, 4);  //ADHFER
				ws.Cells[cptCol, 6] = ReturnReaderValue(monreader, 5);  //MATADH                 
				ws.Cells[cptCol, 7] = ReturnReaderValue(monreader, 6); //NOMFIC
				ws.Cells[cptCol, 8] = ReturnReaderValue(monreader, 7);  //RAISO2                                                                                
				ws.Cells[cptCol, 9] = ReturnReaderValue(monreader, 8);   //RAISOC
				ws.Cells[cptCol, 10] = ReturnReaderValue(monreader, 9);  //DEBDAT
				ws.Cells[cptCol, 11] = ReturnReaderValue(monreader, 10); //FINDAT
				ws.Cells[cptCol, 12] = ReturnReaderValue(monreader, 11);  //DATREC
 
				//rajout
				ws.Cells[cptCol, 13] = ReturnReaderValue(monreader, 12);  //EMITOT
				ws.Cells[cptCol, 14] = ReturnReaderValue(monreader, 13);  //EMILIB
				ws.Cells[cptCol, 15] = ReturnReaderValue(monreader, 14);  //EMIBAS
				ws.Cells[cptCol, 16] = ReturnReaderValue(monreader, 15);  //EMICOE
				ws.Cells[cptCol, 17] = ReturnReaderValue(monreader, 16);  //EMINET
				ws.Cells[cptCol, 18] = ReturnReaderValue(monreader, 17);//EMICOT
				ws.Cells[cptCol, 19] = ReturnReaderValue(monreader, 18);//EMIMT
				ws.Cells[cptCol, 20] = ReturnReaderValue(monreader, 19); //ENCTOT
				ws.Cells[cptCol, 21] = ReturnReaderValue(monreader, 20); //ENCDEB
				ws.Cells[cptCol, 22] = ReturnReaderValue(monreader, 21); //ENCFIN
				cptCol++;		
			}
			else
			{
			   // ws.Cells[cptCol, 1] = sirens[a];
			   // cptCol++;
		   }
			mabarre.PerformStep();
			log.Info("compteur :" + compteur);
			compteur++;
			lblres.Text = compteur.ToString();			
			monreader.Close();
			monreader.Dispose();
 
		cmd.Dispose();
	}//fin for
....
....
	ws.SaveAs(repexc, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

j'ai également joints un fichire excel avec le resultat que j'obtiens en jaune et des lignes en vert, résultat que je dois avoir.
Normalement il doit parcourir les éléments de ma base et me récupérer des valeurs différentes, mais par exemple, pour un siren donnée, il me multiplie ma ligne.

j'ai l'impression qu'il garde les mêmes données quand j'appele ma requete sql dans mon programme.

Vous trouverez un exemple de fichier excel sur le lien suivant :

https://www.cjoint.com/c/LIvh2sidLDZ

merci beaucoup
Merci pour votre aide.
Windows / Chrome 105.0.0.0

A voir également:

6 réponses

yg_be Messages postés 23304 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 novembre 2024 Ambassadeur 1 549
22 sept. 2022 à 11:01

bonjour, 

Dans l'exemple que tu donnes, est-ce que ce sont les résultats complets?

0
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022
22 sept. 2022 à 13:20

Bien le bonjour,

nous c'est un fichire test, pour illustrer que le résultat apparait en doublon.

Exemple: 

dans mon fichier en entrée, de 50 lignes, j'ai un numéro de siren toute les 10 lignes, mon programme enregistre dans un tableau les 10 sirens, jusque là c'est tout bon:

123456...

989878..

323232..

789....

321....

6544...

32121...

121212..

3232...

3232...

Mais quand j'execute ma requete, dans mon fichier excel, j'ai :

123456...

123456...

123456...

123456... 

989878..

989878..

989878..

323232..

323232..

323232..

789....

789....

789....

(des lignes en double)

alors que quand je compare avec la base de données, je devrait avoir, meme si j'ai 4 lignes pour un siren données, toutes des données différentes :

123456... entreprise 1  750€

123456...entreprise 1  70€

123456...entreprise 1  520€

123456... entreprise 1  1750€

989878..entreprise 2  88€

989878..entreprise 2  818€

989878..entreprise 2  9388€

etc....

j'ai l'impression qu'en faisant un (if(monreader.read(....)  dans mon for, il doit n'arrive pas à reprendre les autres données de la base ...

0
yg_be Messages postés 23304 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 novembre 2024 1 549
22 sept. 2022 à 14:04

Le if, en effet, ne  reprend qu'une ligne suite à chaque requête.

que signifie "j'ai un numéro de siren toute les 10 lignes"?

Quel est le lien entre ton fichier d'entrée, et les quatre tables t0, t1, t2, et t3?

Combien de lignes dans ton tableau sirens?

Combien de lignes dans ton Excel?

Essaie d'être précis, de donner des faits précis.

Utilise peut-être un exemple avec moins de données.

0
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022
23 sept. 2022 à 09:47

bonjour,

donc dans mon fichier, il y a des lignes/

DEBECOTT                              DEBI7815469832                                                                                                
FR10FR ACOSS                                                                                                                                                                                                                                                    
DT1DT 65980049800024                        ENTREPRISE DUPONT                                    
DT2                        37050049800024                                                                                                                                                                                                                     
MR1MR 66652315300038                        VILLE                                                        
AEE5E 78861779305653                        URSSAF DE LILLE ET TR                                                                                                                                                                       
AE3                                                                                                                                                                                                                                                            
GEDFDF00401-20222044                711                                                                      
E165DF7050049DF54024                                                                                                                                                                                                                                           

et ça se repete, il n'y a que le siren 37050049800024  et d'autres données qui change.

Le programme parcour le fichier en entrée et va chercher ce siren 37050049800024 puis les autres et les enregistre dans : List<String> sirens = new List<String>();

Admetons que j'ai un fichiers texte 18 lignes ( 2 fois le nombre de ligne que j'ai mis en exemple) , on aura donc 2 sirens d'enregistrés dans le tableau.

J'ai rejoué mon programme, avec un fichier en entrée de 182 lignes, il m'a trouvé 13 sirens et le fichier de sortie contient 13 lignes.

Pour les sirens , il m'a trouvé les numero suivants :

7 fois le numero 123456

5 fois le numero 789654

1 fois le numero 123698

j'ai regardé mon fichier exl généré en sorti et je n'ai pas la ligne avec le numero  123698.

Chaque colonnes des 7 lignes avec le numero 123456 sont identiques ...

De plus : 

mon programme après avoir récupéré les sirens, je souhaite faire, pour chaque siren de ma liste, ma requete, mo nreader et j'enregistre le resutlat dans mon fichier excel à la suite et à la fin, je créé mon fichier excel, mais effectivement cela doit être à cause de mon if.

Toutefois, le soucis, c'est que je parcours ma liste sirens avec une boucle for et je n'arrive pas à faire mon while de ce fait.

Est ce que selon vous , je dois enlever le for pour faire mon while ?
merci beaucoup.

0
yg_be Messages postés 23304 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 novembre 2024 1 549
23 sept. 2022 à 10:10

Si, dans ta liste, tu mets 7 fois le numero 123456, que comptes-tu faire à partir de là?  Traiter sept fois tous les enregistrements pour ce numéro?  Traiter sept fois le premier enregistrement pour ce numéro?

0
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022
23 sept. 2022 à 11:08

Alors logiquement il va me mettre les 7 lignes dans mon fichier excel, car dans la base de données, pour le numero de siren 123456, dans l'une de mes tables, j'ai 7 lignes ( je viens de faire une recherche avec le numero de siren ) avec d'autres données différentes, les une des autres, mais on dirait qu'il boucle sur le 1er résultat qu'il a trouvé, est ce que vous voyez où  je veux en venir?

Merci

0
yg_be Messages postés 23304 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 novembre 2024 1 549
23 sept. 2022 à 12:27

Le programme fait 7 fois la même requête, cela me semble normal d'avoir donc 7 fois le même résultat.

Si tu traites les 7 résultats de chaque requête, tu auras 7 fois les 7 résultats.

0

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

Posez votre question
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022
Modifié le 23 sept. 2022 à 13:11

Ah oui je vois.

donc je dois faire une boucle while et enlever mon for alors ?

0
yg_be Messages postés 23304 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 novembre 2024 1 549
23 sept. 2022 à 14:27

Tout dépend ce que tu veux réaliser, ce que tu n"as pas expliqué.

Il fait peut-être supprimer la boucle for, en effet.

0
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022
8 nov. 2022 à 10:58

Bonjour,

désolé pour le temps de réponse, finallement j'ai réussi, j'ai modifié ma boulce for et au lieu de faire :

	 if (monreader.Read()) //while                                            
			{

j'ai fais un :

                            while (monreader.Read())
                            {

J'avais également un manque d'information en amont (...), j'ai bien paramétré les clefs primaires et mon programme est plus fluide.

Merci beaucoup.

0