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:
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 !