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 :

problème de conflit de type de variables entre des données sous mysql et Builder C++ v.6


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Points : 5
    Points
    5
    Par défaut problème de conflit de type de variables entre des données sous mysql et Builder C++ v.6
    Bonjour,

    Je cherche à afficher des données provenant de tables mysql à laquelle j'accède via le réseau local de ma boite, et je rencontre des problèmes pour lire correctement ces données sous C++ Builder v. 6.

    Je suis d'abord parti d'un tuto de prise en main des BDD sous access de ce site :

    Composants de la palette BDE - Accès à une base de données ACCESS par Ricky81 à l'adresse suivante :

    http://ricky81.developpez.com/tutoriel/bcb/bde/

    pour manipuler des bases access en local grâce à un driver access ODBC. J'ai ajouté en plus un composant TDBGrid relié à un TDataSet relié à une table pou tester ce composant, et tout marche bien.

    J'ai donc décidé de franchir le pas et d'adapter mon programme pour qu'il fonctionne avec une base mysql accessible via le réseau local de mon entreprise.

    (A noter que j'ai bien vu qu'il y avait un tuto de LFE pour la prise en main d'une base SQL en local sur le site développez.com, mais c'est via une DLL et je veux utiliser des pilotes ODBC pour un accès via le réseau).

    Pour cela j'ai recréé un autre alias via BDE Administrator dans l'onglet sources de données systèmes (et non l'onglet source de données utilisateur comme pour la base access en local) et j'ai donc réussi à communiquer avec ma base mysql sur le réseau.

    Dans un premier temps, j'ai utilisé un pilote mysql ODBC mysql 5.1 pour mon alias. Mais j'ai eu plusieurs problèmes :

    1) Mon DBGrid affiche les valeurs numériques de la table, mais pas les données "chaine de caractères" qui étaient rentrées du type "text" dans mysql. Il affichait à la place "ftmemo". En allant jouer dans les propriété des "FieldDefs" et des "Fields" de ma table, rien à faire pour résoudre le problème.

    2) D'autre part, mon code du chapitre 5.1.2 du lien ci dessus plantait.

    Ce code est :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString nom = "";
    AnsiString prenom = "";
    Memo1->Clear();
     
    //ouverture connexion , BDD et table
    Session1->Open();
    Database1->Open();
    Table1->Open();
     
    // On se positionne au début
    Table1->First();
     
    // On parcourt la table
    while (!Table1->Eof)
            {
     
            // On récupère les champs nom et prénoms
     
            nom=Table1->FieldByName("nom")->AsString;
            prenom=Table1->FieldByName("prenom")->AsString;
     
            // On ajoute une ligne à notre mémo
            Memo1->Lines->Add(nom+" "+prenom);
     
            // On passe à la ligne suivante
            Table1->Next();
            }
     
     
    // On ferme connexion, bdd et table
    Table1->Close();
    Database1->Close();
    Session1->Close();

    J'ai donc changé mon type de variable text par "varchar" dans mysql, et là rien à faire, en reconnectant la base tout plante Sans pouvoir réparer quoique ce soit en revenant à des variables de type "text" dans mysql.

    J'ai eu l'idée de recréer un autre alias avec la même base mais cette fois avec avec le driver 3.5.1. Et là mon code 5.1.2 marche nickel pour des variables en "text" dans ma base sql, mais j'ai toujours le même problème avec ma DBGrid qui affiche "ftmemo". Et si je passe en mes variables en varchar tout plante quand je me reconnecte.
    Mon programme 5.1.2 me renvoie des messages de type :

    Type mismatch for field 'nom', expecting: WideString(par exemple) actual:'String' (ou 'unknown') selon les fois, ou "Field is not a Blob" quand je vais changer certaines propriètés. d'où plusieurs questions :

    1) peut-on résoudre le problème par un paramétrage des composants ?
    2) C++ Builder v6 gère-t-il les données de type 'varchar' dans mysql ou est-ce une question de mise à jour ?
    3) Comment afficher des chaines de caractères (de type 'text' ou 'varchar' de mysql dans un TDBgrid de C++ Builder 6 ?
    4) Est-ce que le driver ODBC 5.1 de mysql est pourri ou est-ce ma version de builder qui est trop ancienne ?

    Si quelqu'un a des idées ou des suggestions, merci d'avance !

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Citation Envoyé par bluemax Voir le message
    (A noter que j'ai bien vu qu'il y avait un tuto de LFE pour la prise en main d'une base SQL en local sur le site développez.com, mais c'est via une DLL et je veux utiliser des pilotes ODBC pour un accès via le réseau).
    Si tu parles du tuto sur cette page: http://lfe.developpez.com/BCBmySQL

    Il n'y a pas de problème à l'utiliser avec une BD MySQL sur un serveur.

    Il suffit juste de changer l'adresse IP pour celle l'ordi sur ton réseau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_real_connect(mySQL, "127.0.0.1", "root", "root", "test", 0, NULL, 0)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Salut

    Sincerement , utilises l api sql , c est pas plus compliqué une fois qu on a compris comment çà marche ( quasi la meme logique que sur php )

    Bon WE

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci Crayon et Cedni de m'avoir répondu.

    D'un point de vue technique, l'emploi du tuto Mysql de LFE (qui est bien celui que Crayon indiqué) en remplaçant l'adresse IP par celle de l'ordi sur mon réseau a débloqué la situation.

    J'arrive à lire les champs de la base, et je peux contourner l'emploi du TDBGrid par un TStringGrid avec un code utilisant les fonctions de l'API C de MySql pour remplir les cellules de la grille (je ne l'ai pas encore écrit, mais ça parait très simple).

    Cela dit, c'est dommage de se passer de la puissance du composant TDBGrid qui permet sans code de visualiser le contenu d'une base dans une Form. Je pense que mon code générique marchera dans 99% des cas, mais j'imagine que TDBGrid a été pensé plus en profondeur et marcherait dans 100% des cas si j'arrivais à le faire marcher.

    Donc merci beaucoup. Comme l'API C ne peut pas me fournir d'Alias comme ODBC à mettre dans un composant TDatabase, je vais essayer d'autres pistes :
    - utiliser dBExpress,
    - utiliser ADO.

    Est-ce que quelqu'un a d'autres idées, et pensez-vous que je puisse réussir par ce biais ou que je perds mon temps ?

    Je reviendrai sur ce Post pour donner le résultat de mes recherches et conclure.

    Cordialement.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bon, finalement, j'ai trouvé une solution pour faire fonctionner mon TDBGrid. En fait, il fallait passer par ADO et non par BDE.

    J'ai donc ajouté 4 contrôles à ma Form :
    - 1 TADOConnection,
    - 1 TADOTable,
    - 1 TDataSource
    - 1 TDBGrid

    Pour le paramétrage des 3 premiers, je vous renvoie à l'excellent tutoriel de Loïc YON disponible à l'url :

    http://loicyon.free.fr/download/bcppb6p.pdf

    (chapitre 4.4 p. 40 : utiliser des composants ADO).

    Puis j'ai classiquement lié le TDBGrid au DataSource.

    Et ça marche nickel !

    Je précise que j'ai utilisé l'Alias lié au pilote ODBC mysql version 3.51 que j'avais déjà défini dans BDEAdministrator et non celui lié au pilote ODBC mysql 5.1 (que je n'ai pas pris le temps de tester car le fait que ça marche avec l'autre me suffit).

    Encore merci à tous ceux qui m'ont répondu.

    Problème résolu.

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

Discussions similaires

  1. Détecter type de variable entré
    Par j.theytaz dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 19/09/2010, 14h24
  2. type de variable entre cellule et combobox
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/03/2008, 17h29
  3. concaténer une variable entre des méthodes.
    Par M. sébastien dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 01/06/2007, 20h42
  4. Probleme de type de variable entrée
    Par aladin_lampemagic dans le forum C++
    Réponses: 6
    Dernier message: 13/03/2007, 01h40
  5. Types de variables entre mysql/php et flash
    Par ramses83 dans le forum Flash
    Réponses: 2
    Dernier message: 06/10/2003, 18h35

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