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

Windows Forms Discussion :

[C#]Requêtes INSERT / UPDATE


Sujet :

Windows Forms

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut [C#]Requêtes INSERT / UPDATE
    Bonjour,

    Je travaille habituellement sur une base access mais je pense que mon problème se pose pour toutes les BDD.

    Lorsque je fais une requête insert ou update, et que je traite un champ texte, je dois nécessairement faire monChamp.Replace("'", "''") pour gérer les quotes dans le champ (un quote est remplacé par un double quote).
    Idem pour les double où je dois transformer la virgule en point.

    Existe-t-il une solution plus pratique car il m'est arrivé d'en oublier parfois.

    Merci

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Tout à fait, il y a une bien meilleure solution.
    Quand tu construis une requête sql, il te suffit de remplacer chaque endroit où tu voudrais mettre une valeur provenant de ton code par une un nom symbolique précédé du caractère @. Ensuite tu n'as plus qu'à utiliser la propriété Parameters de ton objet xxxCommand pour attribuer des valeurs à tes noms symboliques.

    Ceci...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String strPrenom = "C'est mon prénom";
    String strNom = "C'est mon nom";
    xxxCommand myCommand = new xxxCommand("INSERT INTO maTable (nom, prenom) VALUES("+strNom.Replace("'", "''") +", "+strPrenom.Replace("'", "''")  +")");
    devient...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xxxCommand myCommand = new xxxCommand("INSERT INTO maTable (nom, prenom) VALUES(@nomPerso, @prenomPerso)");
    xxxCommand.Parameters.Add("@nomperso", "C'est mon nom");
    xxxCommand.Parameters.Add("@prenomPerso", "C'est mon prénom");
    Pour l'exemple, je n'ai pris que des String mais rien ne t'empêche de mettre directement d'autres objets qui représentent ton type sql (int, float, DateTime, ...)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut
    Merci Goldar pour ta réponse.

    Je n'avais pas du tout pensé aux paramètres. Je me demande seulement comment il détecte que le paramètre est un double (et dans ce cas, il transforme la virgule en point) ou un string (et donc remplace le quote par un double quote).

    Mais il doit y avoir une ligne supplémentaire à rajouter pour spécifier le type.

    Je teste tout ça et je reviens te confirmer que c'est OK.

    Merci

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Ado.NET s'occupe de ça déjà, il n'y a pas besoin de se poser la question... Cependant, il arrive que des fois ça ne passe pas et dans ce cas, tu as une alternative qui te permet de spécifier le type de la donnée que tu veux faire passer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    xxxCommand myCommand = new xxxCommand("INSERT INTO maTable (nom) VALUES(@nomPerso)");
    xxxParameter myParam = new xxxParameter("@nomPerso", SqlDbType.VarChar);
    myParam.Value = "C'est mon nom";
    myCommand.Parameters.Add(myParam);

  5. #5
    Membre expérimenté Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Par défaut
    Salut,

    C'est vrai, utiliser les paramètres est bien meilleur que gonfler le code des requêtes avec des Replace, d'ailleurs il n'y a pas que le problème de l'apostrophe, il se peut pour les nombre décimals, que le séparteur décimal système soit une virgule dans ce cas, si tu mets:
    Code VB .NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaCmd.CommandText="UPDATE MaTable SET MaDecimaleColonne=" & MaDecimaleValeur.ToString()
    'avec MaDecimaleValeur.ToString()=="45,65" t'auras :aie: .

  6. #6
    Membre confirmé
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Bonjour voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    OleDbCommand Command = new OleDbCommand("INSERT INTO client (nom, adresse, cp, ville, telephone, fax, email, site, id_type) VALUES(@nom,@adresse,@cp,@ville,@telephone,@fax,@email,@site,@id_type)", Connection);
                Command.Parameters.Add("@nom",tbNom.Text);
                Command.Parameters.Add("@adresse",tbAdresse.Text);
                Command.Parameters.Add("@cp",tbCP.Text);
                Command.Parameters.Add("@ville",tbVille.Text);
                Command.Parameters.Add("@telephone",tbTel.Text);
                Command.Parameters.Add("@fax",tbFax.Text);
                Command.Parameters.Add("@email",tbEmail.Text);
                Command.Parameters.Add("@site",tbSite.Text);
                Command.Parameters.Add("@id_type",cbType.Text);
    ça ne fonctionne pas

  7. #7
    Membre expérimenté
    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 : 48
    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
    Par défaut
    Citation Envoyé par sly60 Voir le message
    ça ne fonctionne pas
    Hier je suis allé voir mon garagiste pour lui dire que ma voiture avait un problème sans rien préciser, après tout il n'a qu'à se démerder c'est bien connu

  8. #8
    Membre confirmé
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    désolé ^^
    Ca me dit l'erreur suivante : Type de données incompatible dans l'expression du critère.

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Le paramètre doit être du même type que le champ dans la base. Si id_type est un champ numérique dans la table, tu dois passer une valeur numérique au paramètre, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Command.Parameters.Add("@id_type", Convert.ToInt32(cbType.Text));
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre confirmé
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Merci ça fonctionne

Discussions similaires

  1. Requête Insert / Update
    Par Loupita dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/07/2012, 12h15
  2. requéte insert /update/delete par dataAdapter
    Par magui_laurene dans le forum Accès aux données
    Réponses: 1
    Dernier message: 02/08/2007, 14h12
  3. Requête INSERT ou UPDATE avec saut de ligne
    Par CinErarY dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/05/2007, 04h38
  4. [ODBC] Faire une requête INSERT, DELETE, UPDATE
    Par avogadro dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/09/2006, 11h35
  5. Réponses: 4
    Dernier message: 05/04/2005, 18h28

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