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 089
    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 089
    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 089
    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 089
    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