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 :

[Firebird2.1] Lire une base unicode


Sujet :

Bases de données Delphi

  1. #1
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut [Firebird2.1] Lire une base unicode
    J'essaye en vain depuis un moment d'afficher correctement une table unicode dans Delphi. J'utilise Firebird 2.1, Delphi 2007 et les composants IBx livrés avec.

    La base a été créée en Default Caracter Set UTF8 et elle contient une seule table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE TRADUCTIONS(
      NUMERO Float NOT NULL,
      TEXTE Varchar(200) character set UTF8
    );
    J'ai ajouté deux lignes avec IBExpert avec un texte Unicode ou je vois bien les données correctement.

    Dans Delphi j'utilise la connexion suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Params.Add('USER_NAME=SYSDBA');
        Params.Add('PASSWORD=masterkey');
        Params.Add('lc_ctype=UTF8');
    Ensuite j'ai un TntDbGrid lié à un TIBQuery. Et là ca ne va plus : les données sont affichées en String simple.
    Les types de champs autocréés sont :
    TFloatField (numero, normal)
    TIBStringField (texte, IBStringField n'est pas un type de chemp unicode )

    Pour retirer le doute sur le TntDbGrid j'ai essayé aussi de lire le résultat de la requète à la main dans un tntLabel mais j'ai le même soucis.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Params.Add('lc_ctype=UTF8');
    ?
    c'est quoi les composants ?
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    C'est les composants Interbase Express livrés avec Delphi 2007.

    Le paramètre lc_ctype définit le jeu de carartère utilisé pour la connexion.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Je viens d'essayer avec DBExpress et c'est exactement la même chose : le colonne 'TEXTE' est considérée commeu un champ ftString et non ftWideString.

    Edit : Je viens d'installer les composants UIB (en utilisant un JvUIBDataSet pour pouvoir le connecter au DataSource) et c'est pareil.

    Je commence à me demander si c'est réellement possible d'afficher une table Unicode avec Delphi comme le fait l'utilitaire FlameRobin :
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Bon j'ai du nouveau : j'ai réussi à affiché la table correctement en Unicode en utilisants des champs presistants de type tntString pour tous les champs en UTF8. Comme cela les champs s'affichent correctement avec Interbase Express.

    Le problème vient maintenant pour remplir la table : pour la modifier directement dans le tntDBGrid j'ai ajouté un TIBUpdateSQL et rempli les requètes correspondantes. Seulement, quand j'essaye de saisir une ligne contenant des caractères non ISO j'ai l'erreur 'Malformed string'...
    J'ai la même erreur si j'essaye un simple update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      With IBSQL1 Do
      Begin
        SQL.Text := 'UPDATE TRADUCTIONS SET TEXTE2=:TEXTE2';
        Params[0].Value := tntEdit1.Text;
        ExecQuery;
        IBTransaction1.Commit;
      End;
    Comment peut on insérer un valeur UNICODE dans la base ?

    Déjà je trouve qu'utiliser des champs persistants d'un type différent du type réel c'est un peu bricolage. Je sents que ça va finir en blob ou en fichier CSV.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Mmmh est-ce que pour le coup le problème ne viendrait pas du fait que la propriété text (donc les lignes de la requête) soit du String et non du WideString et donc lorsqu'il fusionne les string de la requête avec le WideString du paramètre et bien il s'emmêle complètement les pinceaux ?
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Ma collègue m'a suggéré de passer avec un IBTable plutôt qu'un IBQuery et avec les transactions automatiques. Là j'arrive à lire/écrire en Unicode.

    Je ferais un post avec les détails tout à l'heure.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  8. #8
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Bon c'est donc bien résolu avec le TIBTable.

    Au niveau de la connexion c'est toujours ce que j'ai décris en début de sujet, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      With IBDataBase1 Do
      Begin
        If Connected Then Close;
        DatabaseName := Base;
        Params.Clear;
        Params.Add('USER_NAME='+User);
        Params.Add('PASSWORD='+Mdp);
        Params.Add('lc_ctype=UTF-8');
        Open;
      End;
    La connexion est UTF8 semble indispensable au fonctionnement.

    Ensuite il faut poser un TIBTable sur la fiche et y ajouter les champs persistants. Vous pouvez ajouter les champs non unicode directement avec 'Ajouter champs...' mais pour les champs unicode il faudra utiliser 'Nouveau champ...' pour chaque champ. Donner le nom du champ identique à celui visé dans la table et pour le type choisissez tntString. La taille doit être quatre fois la taille du Varchar de la table.

    Les composants visuels unicode de chez tnt fonctionnent alors normalement.

    Pour modifier les valeurs il faudra se mettre sur la bonne ligne (avec les procédures habituelles) puis effectuer les modifications à l'ancienne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      IBTable1.Edit;
      IBTable1Texte2.AsWideString := tntEdit1.Text;
      ...
      IBTable1.Post;
    Si vous ne voulez pas utiliser les champs persistant il faudra créer les le FieldDefs juste avant l'ouverture de la table et accéder aux champs tntString avec un transtypage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TTntStringField(IBTable1.FieldByName('MonChampUnicode')).AsWideString
    Voili voilou.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

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

Discussions similaires

  1. écrire et lire une base mysql avec visual basic
    Par mitch97 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/02/2007, 23h45
  2. [VB6]Lire une base Access sur le Net.
    Par SNDP dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/07/2006, 15h02
  3. [MySQL] Lire une base membres/nbre de colonne
    Par PuppeT mAsTer dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/06/2006, 16h33
  4. [C#] Lire une base de registre distante
    Par Scorff dans le forum C#
    Réponses: 2
    Dernier message: 08/11/2005, 14h39
  5. [jdbc] lire une base
    Par Jchasson dans le forum JDBC
    Réponses: 3
    Dernier message: 27/08/2004, 10h50

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