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++Builder Discussion :

Concaténation d'un entier dans une requête SQL


Sujet :

C++Builder

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 46
    Par défaut Concaténation d'un entier dans une requête SQL
    Bonjour,

    Je veux modifier les champs d'une table.BD (DataBase Desktop) à travers des requêtes SQL, pour une variable de type string j'utilise '"+nomVar+"' et ça marche mais pour les variables de type int j'ai pas trouver de solution
    j'ai essayé la concaténation ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AnsiString sql1= "UPDATE Param_Imp_Ordon SET Hauteur_Entete ='"+Hauteur_Entete+"' WHERE Modele=5";
    AnsiString sql1= "UPDATE Param_Imp_Ordon SET Hauteur_Entete ="+Hauteur_Entete+" WHERE Modele=5";
    AnsiString sql1= "UPDATE Param_Imp_Ordon SET Hauteur_Entete ='+Hauteur_Entete+' WHERE Modele=5";
    et à chaque fois j'ai le message
    E2085 Invalid pointer addition
    il fallait être simple ce truc là.
    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Citation Envoyé par Mariness Voir le message
    Bonjour,

    Je veux modifier les champs d'une table.BD (DataBase Desktop) à travers des requêtes SQL, pour une variable de type string j'utilise '"+nomVar+"' et ça marche mais pour les variables de type int j'ai pas trouver de solution
    j'ai essayé la concaténation ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AnsiString sql1= "UPDATE Param_Imp_Ordon SET Hauteur_Entete ='"+Hauteur_Entete+"' WHERE Modele=5";
    AnsiString sql1= "UPDATE Param_Imp_Ordon SET Hauteur_Entete ="+Hauteur_Entete+" WHERE Modele=5";
    AnsiString sql1= "UPDATE Param_Imp_Ordon SET Hauteur_Entete ='+Hauteur_Entete+' WHERE Modele=5";
    et à chaque fois j'ai le message
    il fallait être simple ce truc là.
    Merci d'avance pour votre aide.

    Ton paramètre "Param_Imp_Ordon", il est de quel type? parce s'il sagit d'un INTEGER, il faudrait aller avec la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      AnsiString sql1= "UPDATE Param_Imp_Ordon SET Hauteur_Entete ="+ IntToStr(Hauteur_Entete)  + " WHERE Modele=5";
    Perso, j'utilise jamais la concaténation dans mes commandes SQL, je préfère utiliser la méthode "sprintf", c'est plus facile à lire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      AnsiString cmd ;
     
      cmd.sprintf("UPDATE Param_Imp_Ordon SET Hauteur_Entete =%d WHERE Modele=5",Hauteur_Entete) ;

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Il existe aussi le TParam et ParamByName

    Pour expliquer l'astuce IntToStr, c'est qu'il produit un objet (allocation statique) de type String (AnsiString ou UnicodeString), hors l'opérateur + est défini entre String et char* (wchar_t*) et provoque donc la concaténation dans le String

    je pratique le sprintf mais le plus propre reste le paramètre (notez le : )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Query->SQL->Text = "UPDATE Param_Imp_Ordon SET Hauteur_Entete = :prmHauteur_Entete WHERE Modele=5";
    Query->ParamByName("prmHauteur_Entete")->AsInteger = Hauteur_Entete;
    Query->ExecSQL();
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Il existe aussi le TParam et ParamByName

    Pour expliquer l'astuce IntToStr, c'est qu'il produit un objet (allocation statique) de type String (AnsiString ou UnicodeString), hors l'opérateur + est défini entre String et char* (wchar_t*) et provoque donc la concaténation dans le String

    je pratique le sprintf mais le plus propre reste le paramètre (notez le : )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Query->SQL->Text = "UPDATE Param_Imp_Ordon SET Hauteur_Entete = :prmHauteur_Entete WHERE Modele=5";
    Query->ParamByName("prmHauteur_Entete")->AsInteger = Hauteur_Entete;
    Query->ExecSQL();
    Je sais même pas pourquoi je réponds.

    "StrToInt" et "IntToStr" remonte à la préhistoire, dans le bon vieux temps du Turbo-Pascal où les strings, c'était des tableaux de caractères 8 bits avec le premier élément qui indiquait la longueur de la chaine de caractère.

    Bien sûr, les strings on été élevés avec le temps au rang de classe et j'imagine qu'on a conservé "StrToInt" et "IntToStr" pour éviter une onde de choc, car disons qu'elles étaient pas mal répandues dans le code, les dites fonctions.

    Perso, je n'utilise plus ces fonctions depuis belle lurette. on est en Programmation Orientée Objet, après tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      int x ;
      AnsiString stg ;
     
     x = 10 ;
     stg = AnsiString(x) ; // Je sais, ça peut se faire implicitement
                                        // pas nécessaire de me l’expliquer, 
     x = stg.ToInt() ;
    Sauf que quand un élève me pose une question, je lui réponds en fonction de son niveau. "StrToInt" et "IntToStr", ça passe à peine avec un débutant qui a déjà de la difficulté à saisir la nuance entre une valeur binaire d'un nombre et sa représentation ascii, un concept avec lequel ils ont beaucoup de difficulté.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString sql1= "UPDATE Param_Imp_Ordon SET Hauteur_Entete ='"+Hauteur_Entete+"' WHERE Modele=5";
    Cette méthode est la bonne, mais pour répondre au problème, effectivement tu peux effectuer un IntToStr() directement dans la concaténation à l'intérieur d'une requête (même si selon certains, c'est pas très propre, et un peu obsolète).

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Citation Envoyé par Guyt54 Voir le message
    "StrToInt" et "IntToStr" remonte à la préhistoire, dans le bon vieux temps du Turbo-Pascal où les strings, c'était des tableaux de caractères 8 bits avec le premier élément qui indiquait la longueur de la chaine de caractère.
    C'est faux !
    Ce n'est pas de la préhistoire mais des fonctions RTL indispensable à Delphi !

    StrToInt et IntToStr sont des fonctions Delphi, c'est l'équivalent de atoi et itoa, il n'y a pas de conversion implicite en Delphi comme en C++
    Il existe Format (équivalent de sprintf) ou encore Val mais l'on utilise beaucoup StrToInt\IntToStr

    D'ailleurs, l'utilisation de IntToStr au lieu du constructeur Entier du AnsiString amène une grande différence lorsque l'on migre un projet 2007 ANSI vers Unicode (2009..XE2) car Embarcadero pour dissuader l'utilisation du type AnsiString (au profit du UnicodeString) a tout simplement retiré les constructeurs avec conversion de type !
    Tout comme DateToStr\StrToDate au lieu de la conversion implicite du double !
    Si l'on respecte les standards RTL Delphi en C++Builder en utilisant justement ces fonctions, il n'est pas nécessaire de corriger tout le code lors de la migration en mode wchar_t


    Certe la classe AnsiString du C++Builder est un objet, mais en Delphi jusqu'à 2007, c'est un pointeur sur un record (en -4 c'est la longueur, -8 le compteur de référence), depuis 2009, c'est toujours un pointeur mais on peut rajouter en -12 et -10, le CharSet et la taille du Char !
    tous ces éléments sont présent aussi dans la classe AnsiString puis le code Delphi compilé de la VCL utilise son propre type interne et utilise la même zone mémoire que l'objet passé en paramètre !

    Il est drôle que tu soulignes mon commentaire sur IntToStr venant de TA réponse alors que l'élément important de ma réponse c'est le TParam !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    ok

Discussions similaires

  1. Concaténation de chaine dans une requête sql
    Par mauriceletendu dans le forum R
    Réponses: 0
    Dernier message: 13/08/2014, 11h42
  2. Concaténation dans une requête SQL
    Par Benamour Jr dans le forum Langage
    Réponses: 9
    Dernier message: 30/03/2010, 13h17
  3. Concaténation variable dans une requête sql
    Par pasc06 dans le forum Langage
    Réponses: 4
    Dernier message: 25/11/2008, 17h07
  4. [SQL]Concaténation avec retour chariot dans une requête
    Par celiaaa dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 09/04/2007, 23h36
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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