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

Bases de données Delphi Discussion :

Mon appli n'aime pas les accents


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut Mon appli n'aime pas les accents
    Bonjour,

    Je développe une application sous Delphi7 pour Interbase 6.5. Ma DB créé a été définie de la manière qui suit :

    charset : iso9xxx_1

    Lorsque j'entre une donnée via une commande sql à partir d'un quelconque outil de base de donnée, je peux insérer dans mes champs de type varchar des accent. -->

    Lorsque je lance mon appli et que je veux ajouter un enregistrement quelconque (avec accent) j'ai un message d'erreur : arithmetic overflow, string truncation, etc... (si je retire l'accent, l'enregistrement veux bien s'insérer).

    J'utilise des objets dbexpress pour la connection à la db. J'utilise des TSQLQuery,Tdatasetprovider, TclientDataSet et DataSource pour accéder au différentes tables et champs.

    Quelqu'un saurait me dire où j'ai merdé dans mon paramétrage des composants Delphi ?

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Tu peux nous passer le code de la fonction où se passe ton erreur ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    Cela se passe dans toutes mes requêtes SQL (à condition que je place un accent) :

    Je les construis de la manière suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    monObjetSQL.SQL.Text := 'insert into maTable (champ1,champ2,...champX) values (' +
                  inttostr(val1)  + ',' +  //ici j'aurai un champ entier...
                  val2              + ',' + // mon texte comprenant un ou des accents
                  ...
                  valX;
    monObjetSQL.execSQL(true);
    ici, c'est lors d'un insert, mais cela est le même lors d'un update.

    Pour rappelle, j'utilise les compo DBExpress.

    En espérant que ça t'aide un peu mieux pour comprendre mon problème

  4. #4
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Bon...je ne connais pas Interbase mais :
    1/ Peux tu gérer l'exception et stocker le message de retour ?
    2/ Pour les champs texte ne doivent t'ils pas être entre quotes (') ?
    3/ Que se passe t'il quand tu lance ta requète 'qui plante' directement dans l'interface d' Interbase ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    1/ Peux tu gérer l'exception et stocker le message de retour ?
    Voici le message d'erreur : Arithmetic exception, numeric overflow, or string truncation, character transliteration failed
    Je pense que ce qui me bloque c'est la partie rouge

    This happens when you have data in database stored in one character set, but the transliteration to required character set fails. There are various points where character set transliteration occurs. There is an automatic one:
    2/ Pour les champs texte ne doivent t'ils pas être entre quotes (') ?
    Ils sont bien entre quote, désolé, dans l'exemple je les ai omis.
    3/ Que se passe t'il quand tu lance ta requète 'qui plante' directement dans l'interface d' Interbase ?
    Cela se passe bien. Quand j'utilise ibexpert, databaseworkbench ou sqlexplorer cela se passe comme une lettre à la poste MAIS, je rajoutais à chaque fois dans la table, et non via une requête (j'essaierai ce soir voir si j'ai une erreur quand je passe par une requête).

    Ce qui m'intrigue, lorsque je fais un select d'une table où j'ai ajouter manuellement des enregistrement contenant des accents, il ne provoque pas d'erreur (je peux même faire un order by sur ces même champs).

  6. #6
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Bon visiblement c'est un pb de déclaration de table de car. dans ton application.
    Peux tu faire passer le code où tu déclares ta table dans Delphi ??

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    Je l'envoi ce soir, j'ai pas mon appli sous la main (c'est pour mon TFE).

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Cela m'étonne que cela focntionne aussi sans accent vu la grosse erreur d'écriture de la requete.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    With MonObjetSQL do
    begin
      SQL.Clear;
      SQL.Add('insert into maTable (champ1,champ2,...champX) values (');
      SQL.Add(inttostr(val1)  + ','); //ici j'aurai un champ entier...
      SQL.Add(QuotedStr(val2) + ','); // <-- ici l'erreur
                  ...
      execSQL;
    end;
    Sinon le plus simple est de passer par les paramètres, cela evite d'utiliser les convertions et ajout de quote.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    With MonObjetSQL do
    begin
      SQL.Clear;
      SQL.Add('insert into maTable (champ1,champ2,...champX)');
      SQL.Add('values (:VCmp1,:VCmp2,...,:VCmpX)');
      ParamCheck := True; 
      ParamByName('VCmp1').Value := Val1;
      ParamByName('VCmp2').Value := Val2;
                  ...
      ParamByName('VcmpX').Value := ValX;
      execSQL;
    end;

  9. #9
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    @Malatar => Euh...si tu lis bien on a déja évoqué le problème du 'quoted' !
    Vu le pb rencontré je ne pense pas que le passage par des param. soit la solution.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    Effectivement Malatar, comme je l'ai expliqué précédement, dans mon exemple j'ai oublié le quotedstr, chose, bien entendu, que j'ai pas fait dans mon code (je ne l'ai pas sous la main).

    Je sais que mon problème viens des accents que je met dans les champs (via requête sql sous Delphi). Ce soir, je vais checker les différentes tables (ma connection est bonne, j'y avais déjà pensé)

    [Hors sujet : dorénavant, je vais essayer de passer par les paramètres, je comprend mieux leurs utilités en voyant ton exemple]

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par philnext Voir le message
    @Malatar => Euh...si tu lis bien on a déja évoqué le problème du 'quoted' !
    Vu le pb rencontré je ne pense pas que le passage par des param. soit la solution.
    J'ai vu cela après avoir mis ma réponse
    Dur, dur la reprise après les congès

    Citation Envoyé par dd_garion Voir le message
    Effectivement Malatar, comme je l'ai expliqué précédement, dans mon exemple j'ai oublié le quotedstr, chose, bien entendu, que j'ai pas fait dans mon code (je ne l'ai pas sous la main).

    Je sais que mon problème viens des accents que je met dans les champs (via requête sql sous Delphi). Ce soir, je vais checker les différentes tables (ma connection est bonne, j'y avais déjà pensé)

    [Hors sujet : dorénavant, je vais essayer de passer par les paramètres, je comprend mieux leurs utilités en voyant ton exemple]
    Peux tu nous montrer la structure de ta table (le SQL serait bien) ?

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    De tête, mes tables sont créés de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create table MATABLE (
    MATABLEID integer  not null ,
    MonChampText1 varchar(25) ,
    MonChampText2 varchar(15) ,
    MonChampText3 varchar(20)  , 
    constraint PK_MATABLE  primary key (MATABLEID ))
    Je n'ai pas mis les index (créé à partir d'ibexpert).

    J'utilise donc des varchar pour mes champs textes. Le jeu de carcatère étant iso8859_1
    Le champ MATABLEID étant généré via une procédure stocké qui appèle les générateurs.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    Salut tous le monde,

    Je confirme, ma table est bien créé de la manière dont j'ai évoqué.

    Si quelqu'un a une idée...

    Dans Delphi, j'accède aux différentes table via la série d'objets suivants :

    -TSQLQuery
    -TDataProvider lié au sqlQuery.
    -TClientDataSet lié au dataprovider
    - datasource lié au clientdataset.

  14. #14
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Tu as regardé l'hypothèse du charset que j'avais évoqué dans un post précédent ?

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 192
    Points
    192
    Par défaut
    Oui, mon charset des tables est bien en iso..._1.

    Il faut savoir, qu'à partir de mon appli, j'arrive à afficher dans mes dbgrid et cie les enregistrements contenant des caractères à accents.

    Dans mon objet sqlconnection j'ai au niveau du charset le charset par défaut (même en spécifiant le charset iso... rien ne change).

    Je résume :
    Ma db est définit avec un charset iso...
    Mes champs varchar sont définit, au niveau charset, comme iso...

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/11/2008, 14h32
  2. Réponses: 2
    Dernier message: 07/08/2007, 21h41
  3. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45

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