IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

récupérer le contenu d'un select pour l'utiliser dans un insert


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Points : 164
    Points
    164
    Par défaut récupérer le contenu d'un select pour l'utiliser dans un insert
    Bonsoir,
    Voilà, je voudrais récupérer la donnée d'un select fonction d'une combobox afin de la réutiliser derrière dans mon insert.

    J'ai essayé de créer une variable mais sans succès. Je vous laisse le code pour vous faire une idée. Enfin en écourté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    private void btmValider_Click(object sender, EventArgs e) 
    { 
    OleDbCommand cmdRecupno = new OleDbCommand(); 
    cmdRecupno.Connection = cnx; 
    cmdRecupno.CommandText = @"select no 
    from op 
    where op.nom = '+ cbOp.Text' "; 
     
     
    OleDbCommand cmdInsertInt = new OleDbCommand(); 
    cmdInsertInt.Connection = cnx; 
     
    cmdInsertInt.CommandText = @"INSERT INTO int (noint,noop, entree, sortie) 
    VALUES (SEQ_INT.nextval,?,?,?)"; 
     
     
    string dateString = "11/22/2008 11:30:52"; 
    DateTime date1 = DateTime.Parse(dateString, CultureInfo.InvariantCulture); 
    string date2String = "11/22/2008 11:40:52"; 
    DateTime date2 = DateTime.Parse(date2String, CultureInfo.InvariantCulture); 
     
    cmdInsertInterv.Parameters.Add(new OleDbParameter("@NOOP",cmdRecupno)); 
    cmdInsertInterv.Parameters.Add(new OleDbParameter("@ENTREE", date1)); 
    cmdInsertInterv.Parameters.Add(new OleDbParameter("@SORTIE", date2)); 
    cnx.Open(); 
    cmdRecupno.ExecuteNonQuery(); 
    cmdInsertInt.ExecuteNonQuery(); 
    cnx.Close(); 
    }
    Merci

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Un objet DBCommand ne peut pas être utilisé comme valeur d'un paramètre pour une requête. Ensuite, la méthode ExecuteNonQuery renvoie le nombre de lignes affectées par la commande. C'est donc inutilisable pour du SELECT et c'est ce que tu fais.

    Utilise ExecuteReader (voir MSDN ou google pour des bouts de code) ou éventuellement ExecuteScalar, si le SELECT ne renvoie qu'une ligne et que c'est la première valeur de cette ligne qu'il te faut.

    Pour parvenir à tes fins tu dois donc faire les choses suivantes :

    1. Exécution du SELECT et récupération du résultat
    2. Création de l'INSERT, en utilisant le résultat du SELECT
    3. Exécution de l'INSERT

    Au passage, utilise aussi une requête paramétrée pour ton SELECT, tu le fais bien pour l'INSERT.
    Pas de questions techniques par MP

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Points : 164
    Points
    164
    Par défaut
    Ok merci, je vais essayé de voir de ce côté et de le repenser
    Mais le souci, c'est que je vois pas comment récupérer le résultat du select. Ou le stocker.

    Désolé, je débute

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par ifsera Voir le message
    Mais le souci, c'est que je vois pas comment récupérer le résultat du select. Ou le stocker.
    Je t'ai indiqué comment récupérer ce résultat
    Utilise ExecuteReader (voir MSDN ou google pour des bouts de code) ou éventuellement ExecuteScalar, si le SELECT ne renvoie qu'une ligne et que c'est la première valeur de cette ligne qu'il te faut.
    Après à toi de jouer
    Pas de questions techniques par MP

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Points : 164
    Points
    164
    Par défaut
    J'ai joué, mais j'ai le sentiment de pas avancer. En statique mon insert marche. Mais je n'arrive pas à passer le résultat du select en paramètre. Tout le reste me semble bien.

    Les autres éléments s'insèrent dans la base. Je laisse mon code si quelqu'un voit. Le souci me semble au niveau du select. Bref je sais pas le faire. J'ai eu un tas d'erreur, "nombre invalide", "n'a pas de paramètre par défaut".

    Si quelqu'un voit je prends:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
       lblInfo.Visible = false;
                if ((txtHeueEntree.Text != "") && (txtHeureSor.Text != ""))
               {
                   OleDbCommand cmdRecupnoOpe = new OleDbCommand();
                   cmdRecupnoOpe.Connection = cnx;
                   cmdRecupnoOpe.CommandText = @"select noope
    			     from ope
    			     where ope.nom  = '+ cbTypeOpe.Text'";
     
                   cnx.Open();
                   //string a =  (string)cmdRecupnoOpe.ExecuteScalar();
                   cmdRecupnoOpe.ExecuteReader();
     
                    OleDbCommand cmdInsertInterv = new OleDbCommand();
                    cmdInsertInterv.Connection = cnx;
                    cmdInsertInterv.CommandText = @"INSERT INTO interv (nointerv,noemp,noope,
                                                noau, observation, entree, sortie)
                                              VALUES (SEQ_INTERV.nextval,?,?,?,?,?,?)";
                    cmdRecupnoOpe.ExecuteScalar();
                    DateTime date = DateTime.Parse(CalenEntree.Text);
                    DateTime time = DateTime.Parse(txtHeueEntree.Text, CultureInfo.InvariantCulture);
                    date.Add(new TimeSpan(time.Hour, time.Minute, time.Second));
                    DateTime date2 = DateTime.Parse(CalenSortie.Text);
                    DateTime time2 = DateTime.Parse(txtHeureSor.Text, CultureInfo.InvariantCulture);
                    date.Add(new TimeSpan(time.Hour, time.Minute, time.Second));
                    //Les paramètres des différentes cmdInsertInterv 
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@NOEMP", cbNoEmp.Text));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@NOOPE", a));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@NOAU", cbNoAu.Text));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@OBSERVATION", txtObserv.Text));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@ENTREE", time));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@SORTIE", time2));
     
     
                    cmdInsertInterv.ExecuteNonQuery();
                    cnx.Close();

    Il y a sans doute un peu de surplus.
    En gros, tout s'insert, sauf le paramètre issu du select que je n'arrive pas à faire passer

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ce n'est pas étonnant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmdRecupnoOpe.ExecuteReader();
    Ce code ne sert à rien en l'état. Tu ne récupères pas le DataReader pour le traiter, tu ne risques pas d'aller bien loin avec. Regarde la MSDN, comme je l'ai déjà dis, pour la documentation de ces méthodes. Tu auras des exemples de code qui t'aideront

    Sinon vu la requête, la méthode ExecuteScalar devrait suffire. A priori tu as essayé avec, mais puisque la ligne est en commentaire tu as du rencontrer un problème. Vérifie en debug le type retourné par la méthode, car ton cast est probablement mauvais.
    Pas de questions techniques par MP

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Points : 164
    Points
    164
    Par défaut
    Oui, c'est bien ça. J'ai un souci avec l'executescalar.


    J'ai comme erreur, le paramètre [1] n'a pas de valeur par défaut. Voilà comment je l'ai construit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    object a = cmdRecupnoOperation.ExecuteScalar();

    s'il y a des orientations, je prends evidemment.

  8. #8
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Si tu as défini ta requête ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cmdRecupnoOpe.CommandText = @"select noope
    			     from ope
    			     where ope.nom  = '+ cbTypeOpe.Text'";
    ce n'est pas étonnant que ça ne fonctionne pas. Tu ne concatènes pas cbTypeOpe.Text en faisant ça, cbTypeOpe.Text fait partie de la chaîne tel quel.

    Probablement qu'avec ceci ça ira un peu mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmdRecupnoOpe.CommandText = 
    "select noope from ope where ope.nom = '" + cbTypeOpe.Text.Replace("'", "''") + "'";
    Mais il vaut mieux faire ce que j'avais déjà dis plus haut
    Au passage, utilise aussi une requête paramétrée pour ton SELECT, tu le fais bien pour l'INSERT.
    Pas de questions techniques par MP

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Points : 164
    Points
    164
    Par défaut
    Ouais merci, le problème se situe bien au niveau du select.

    Mais bon, il faut que j'y jette encore un oeil, parce que ça marche pas à tous les coups. Dès que je modifie le choix dans la combo, le select plante.

    Quant à ta proposition :
    Mais il vaut mieux faire ce que j'avais déjà dis plus haut

    Citation:
    Au passage, utilise aussi une requête paramétrée pour ton SELECT, tu le fais bien pour l'INSERT.
    Je t'avouerai que pour l'instant je préfères laisser ça de côté. Tant que ça marche. Et ouais, j'ai pas encore énormément de c sharp dans ma besace.

    Je me suis battu avec ce code. J'obtiens quelque chose. Le hic est que ça dure un temps et vlan, ça tombe:

    La référence d'objet n'est pas définie à une instance d'un objet.

    Si quelqu'un a une explication. Moi je cherche encore
    Voilà la partie de code incriminée sans oubli:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
       cnx.Open();
                     OleDbCommand cmdRecupnoOperation = new OleDbCommand();
                     cmdRecupnoOperation.Connection = cnx;
     
                    //Remet le format du cbTypeOperation au bon format
                    string az = cbTypeOperation.Text;
                     MessageBox.Show(az);
                     string qw = az.ToUpper();
                     MessageBox.Show(qw);
                    object NOOP = new object(); 
                    cmdRecupnoOperation.CommandText = @"select nooperation 
                     from operations where operations.nom = '" + qw + "'";
     
     
                    NOOP = cmdRecupnoOperation.ExecuteScalar();
                    MessageBox.Show(NOOP.ToString());
     
                    OleDbCommand cmdInsertInterv = new OleDbCommand();
                    cmdInsertInterv.Connection = cnx;
                    cmdInsertInterv.CommandText = @"INSERT INTO interv (nointerv,noemp,nooperation,
                                                noauto, observation, entree, sortie)
                                              VALUES (SEQ_INTERV.nextval,?,?,?,?,?,?)";
     
                    //Galère pour pouvoir insérer la concaténation date + heure
                    DateTime date = DateTime.Parse(CalenEntree.Text);
                    DateTime time = DateTime.Parse(txtHeueEntree.Text, CultureInfo.InvariantCulture);
                    date.Add(new TimeSpan(time.Hour, time.Minute, time.Second));
                    DateTime date2 = DateTime.Parse(CalenSortie.Text);
                    DateTime time2 = DateTime.Parse(txtHeureSor.Text, CultureInfo.InvariantCulture);
                    date.Add(new TimeSpan(time.Hour, time.Minute, time.Second));
                    //Les paramètres des différentes cmdInsertInterv 
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@NOEMP", cbNoEmp.Text));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@NOOPERATION", NOOP ));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@NOAUTO", cbNoAuto.Text));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@OBSERVATION", txtObserv.Text));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@ENTREE", time));
                    cmdInsertInterv.Parameters.Add(new OleDbParameter("@SORTIE", time2));
     
                    cmdInsertInterv.ExecuteNonQuery();
                    cnx.Close();
    Ca replante : La référence d'objet n'est pas définie à une instance d'un objet.

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Points : 164
    Points
    164
    Par défaut
    Ca a marché deux minutes, et plus rien. J'ai beau cherché. Je vois pas ce que j'ai modifié.

    Par contre, le problème est au niveau du select. Je n'arrive pas à mettre son résultat dans une variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    object NOOP = cmdRecupnoOperation.ExecuteScalar();
    J'ai le choix entre deux messages d'erreur:
    En ce moment, c'est
    le paramètre n'a pas de valeur par défaut

    Je comprends mais je vois pas comment y rémédier. Je croyais en mon objet.

    C'est bon, c'est résolu. Des petits détails dans mes requêtes il faut coire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/07/2015, 12h36
  2. Réponses: 2
    Dernier message: 11/03/2011, 21h17
  3. Réponses: 1
    Dernier message: 22/04/2010, 00h32
  4. Récupérer le contenu d'un champs pour un calcul ?
    Par dark_vidor dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/01/2006, 10h25
  5. Récupérer le contenu d'un select
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/08/2005, 15h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo