Menu

Chaque ligne égale à la Requete ou non [Résolu/Fermé]

Messages postés
67
Date d'inscription
mardi 21 juillet 2015
Statut
Membre
Dernière intervention
2 février 2018
-
Bonjour, comme il est indiqué dans le Titre , j'ai une sorte de TextBox multilines d'ou je dois rentre plusieurs références et en cliquand sur le boutton sa m'affiche dans un tableau le "nomArticle" et " CodeArticle" .
et si un des réf n'existe pas dans la base bah il m'affiche juste la réference dans un autre tableau.
j'ai fais une sorte de Boucle ligne par ligne et m'affiche a chaque fois
Je vous montre un peu le code :
  protected void Button1_Click(object sender, EventArgs e)
        {
            Con.Open();

            DataTable dt = new DataTable();


            //char delimiter = '\n';
            //string[] substrings = search.Text.Split(delimiter);


            string[] delimiteur = { Environment.NewLine }; // "\r\n" retour chariot ! 
            string[] lignes = search.Text.Split(delimiteur, StringSplitOptions.RemoveEmptyEntries);//cette option à l'avantage de virer les lignes vides.


            List<Resultat> res = new List<Resultat>();

            foreach (var substring in lignes)

                 {

                SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork  Where Ref_Art='" + substring + "'", Con);
                
               
                SDA1.Fill(dt);
                res.Add(new Resultat { NomArticle = (dt.Rows[0].Field<string>(0)), CodeArticle = dt.Rows[0].Field<string>(1), Ref_Art = substring });
               

            }

           
       GridView1.DataSource = dt;

            GridView1.DataBind();
            Con.Close();
        }


Ce que je veut faire c'est de tester chaque ligne et si la réference existe alors afficher sinon afficher dans un autre tableau.

ce qui donne un peu sa !

            DataTable dt = new DataTable(); // Table Ref existe dans la Base
     DataTable dnt = new DataTablee (); // Table Ref non existe dans la Base

foreach ( var Substring in Lignes ) 
 {
 if ( Substring = existe ) 
 {
  SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork  Where Ref_Art='" + substring + "'", Con);
               
                SDA1.Fill(dt);
                res.Add(new Resultat { NomArticle = (dt.Rows[0].Field<string>(0)), CodeArticle = dt.Rows[0].Field<string>(1), Ref_Art = substring });
  }
 else 
 {
 SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork  Where Ref_Art='" + substring + "'", Con);
               
                SDA1.Fill(dnt);
                res.Add(new Resultat { NomArticle = (dt.Rows[0].Field<string>(0)), CodeArticle = dt.Rows[0].Field<string>(1), Ref_Art = substring });
 }
 }

Aider moi a faire le Test If ( ligne = existe ) ou n'importe quel autre solution

Merci .
Afficher la suite 

2 réponses

Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
344
0
Merci
Bonsoir

dans la discussion précédente, je t'avais dit que finalement, la liste ne te sert pas.
donc cette ligne
res.Add(new Resultat { NomArticle = (dt.Rows[0].Field<string>(0)), CodeArticle = dt.Rows[0].Field<string>(1), Ref_Art = substring });
n'a plus lieu d'être.
Et la classe Resultat, peut être supprimée.


Pour ta question, une solution est de conserver le nombre de lignes dans le datatable et s'il n'a pas changer c'est que la référence n'existe pas
dylan_garrix
Messages postés
67
Date d'inscription
mardi 21 juillet 2015
Statut
Membre
Dernière intervention
2 février 2018
-
moi j'ai fais une autre foreach comme sa juste je galère pour la condition un peu je sais pas comment l'écrire :
Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
344 -
Je sais le faire avec Linq sur des collections, mais pas avec des datatable.
Il y a sans doute moyen de savoir si une requête ne retourne rien, mais j'ai pas trouvé.

Là tu travailles sur quelques références, mais imagine que tu doivent traiter 10 000 références, avec 2 foreach, tu vas faire 20 000 requêtes, et là le temps d'exécution va s'en ressentir.
Quand on peut faire une seule boucle, il faut le privilégier.

Ceci réponds à ton besoin (tapé de tête)
            List<string> Inconnus = new List<string>();
            int nombreLignes =0;

            foreach (var substring in lignes)

                 {

                SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork  Where Ref_Art='" + substring + "'", Con);
                
               
                SDA1.Fill(dt);
               
                 if( nombreLignes == dt.Rows.Count)
                            Inconnus.Add(substring)
                 else 
                        nombreLignes = dt.Rows.Count;
            }

           
       GridView1.DataSource = dt;

            GridView1.DataBind();
            
            GrdiView2.DataSource = Inconnus;


dylan_garrix
Messages postés
67
Date d'inscription
mardi 21 juillet 2015
Statut
Membre
Dernière intervention
2 février 2018
> Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
-
oui sa marche parfait merci beaucoup t'es un génie ! tu peut m'expliquer quelques trucs dedans pour comprendre comment ta fais :
1 ) List<string> Inconnus = new List<string>();
2 ) if( nombreLignes == dt.Rows.Count)
Inconnus.Add(substring)
else
nombreLignes = dt.Rows.Count;
Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
344 -
Et bien je crée un entier liste de string vide.
Si le nombre de lignes dans le datatable est le même qu'avant, y a pas eu de changement donc la référence est inconnue, je la mets dans la liste.
A l'inverse, s'il y a eu une nouvelle ligne, je réactualise la variable pour la prochaine référence
dylan_garrix
Messages postés
67
Date d'inscription
mardi 21 juillet 2015
Statut
Membre
Dernière intervention
2 février 2018
-
d'accord merci
0
Merci
pourtant me semble que l'algo est faux non ?
tu as essayé avec une ref connu, une inconnue, une connu, une inconnu ?

dans ce cas me semble pas que sa fonctione

max
dylan_garrix
Messages postés
67
Date d'inscription
mardi 21 juillet 2015
Statut
Membre
Dernière intervention
2 février 2018
-
Oui sa marche parfaitement, Un connu il me le met dans la Table Connu et un non Connu il me le met dans la Table non connu
> dylan_garrix
Messages postés
67
Date d'inscription
mardi 21 juillet 2015
Statut
Membre
Dernière intervention
2 février 2018
-
Ok ok en faisant tourner l'algo dans ma tete j'ai l'impression qu'avec 4 ref : une connue, une inconnue, une connue, une inconnu ca marchais pour les 2 premières et ensuite pas pour les 2 dernières ... mais si tu dis que tu est ok je me plante surment.

max