Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2008, 18h35   #1
Invité de passage
 
Inscription : mars 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 10
Points : 2
Points : 2
Par défaut récupérer le type d'un champ

Bonjour.
J'ai pas mal fouillé les faq, les tutoriels et les forums, mais je n'ai pas trouvé de réponse complète à ce que je recherche (les éléments trouvés m'ont cependant permis d'élaborer la solution sustitutive que j'expose ci-dessous)

Précision : je travaille avec delphi 2005 et mysql.pas

En fait je souhaite récupérer les données de mes tables pour faire une sauvegarde à l'aide d'une procédure générique.
Pour cela, je cherche à récupérer le type des champs pour savoir si j'inclus dans le code un quotedstr ou non
En fouillant un peu dans le code de mysql.pas, j'ai vu que le type mysql_field proposait une valeur ._type censée donner le type de champs selon un ensemble enum_field_types
Lorsque j'ai essayé cette méthode, les valeurs retournées m'ont semblé inexploitables, car la valeur retournée est assez farfelue (par exemple, quelle que soit la table, le dernier champ retourne toujours 51 quel que soit le type de champ)
J'ai également tenté d'utiliser les fonctions is_num, is_num_field, sans succès :o(
J'ai donc utilisé le code suivant, qui me paraît un peu "barbare", en créant une fonction numtype renvoyant un boolean après comparaison avec un ensemble de valeur représentant un type numérique.
Je suppose qu'il existe un autre moyen que d'extraire les informations de la colonne dans une requête pour comparer la valeur du champ type avec le référentiel au sein de la fonction numtype ?
Quelqu'un aurait-il une solution plus élégante ?
Je sais également qu'il existe mysqldump, mais la résolution de cette fonctionnalité constitue pour moi un très bon exercice pour (tenter de) m'améliorer (par ailleurs, le nombre d'option possible m'a un peu fait peur : ça a l'air assez complexe)
Ensuite je vous interrogerai peut-être pour savoir comment faire pour exécuter un fichier contenant toutes les requêtes créées par ma fonction de sauvegarde afin de faire un restore (hormis parser le fichier jusqu'au prochain point virgule, je n'ai pas trouvé de solution toute faite pour exécuter une suite de requête rassemblée au sein d'un même fichier (mais je débute !))
Merci d'avance pour votre aide si précieuse ;o)

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 
Var
  myres, myres2: PMYSQL_RES;
  myROW, myrow2 : PMYSQL_ROW;
  FIELD: pmysql_field;
  aStr : AnsiString;
  s, sigle, letype: string;
  i,j, nbcol : integer;
 
  refchampnum: SET of 0..255;
 
  FUNCTION numtype(s: string): BOOLEAN;
  begin
  result:=false;
  s:=leftstr(s, pos('(',s)-1);
  IF    (s='tinyint')
     OR (s='bit')
     OR (s='smallint')
     OR (s='mediumint')
     OR (s='int')
     OR (s='integer')
     OR (s='big')
     OR (s='float')
     OR (s='double')
     OR (s='decimal')
     OR (s='dec')
     OR (s='numeric')
     OR (s='fixed')
     OR (s='year')
     then
     result:=true;
  end;
 
  procedure dumptable(t: string);
  var
     i, j: integer;
  begin
  WITH memor.LINES do
       begin
       refchampnum:=[];
       mysql_query(mysqlc, pChar('select * from '+t));
       myres:=mysql_store_result(MySQLc);
       IF myres<>nil then
          begin
          s:='INSERT INTO '+t+' (';
          FOR i:=0 TO mysql_num_fields(myres)-1 do
              begin
              FIELD:=mysql_fetch_field_direct(myres, i);
              s:=s+FIELD.name;
              IF i<>lb2.Count-1 then
                 s:=s+', ';
              mysql_query(mysqlc, pChar('SHOW COLUMNS FROM '+t+' LIKE '+quotedstr(FIELD.name)));
              myres2:=mysql_store_result(MySQLc);
              IF myres2<>nil then
                 begin
                 letype:=mysql_fetch_row(myres2)^[1];
                 IF numtype(letype) then
                    refchampnum:=refchampnum + [i];
                 mysql_free_result(myRES2);
                 end;
              end;
          s:=s+') VALUES ';
          ADD(s);
          FOR i:=0 TO myRES.row_count-1 do
             begin
             myROW:=mysql_fetch_row(myRES);
             IF myrow<>nil then
                begin
                s:='(';
                FOR j:=0 TO mysql_num_fields(myRES)-1 do
                    begin
                    IF j IN refchampnum then
                       s:=s+myrow^[j]
                    else
                       s:=s+quotedstr(myrow^[j]);
                    IF j<>mysql_num_fields(myRES)-1 then
                       s:=s+','
                    else
                       IF i<>myRES.row_count-1 then
                          s:=s+'),'
                       else
                          s:=s+');';
                    end;
                ADD(s);
                end;
             end;
          mysql_free_result(myRES);
          end;
       ADD('');
       end;
  end;
yvan.chambault est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 22h01   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 409
Points : 6 409
Bonjour,

Quelle version de MySQL utilises-tu ?
Si c'est une version supérieure ou égale à la 5.0.2, tu peux utiliser une requête sur le catalogue MySQL (la base INFORMATION_SCHEMA). La table qui t'intéresse s'appelle INFORMATION_SCHEMA.COLUMNS, et le champ DATA_TYPE donne le type d'une colonne :
Code :
1
2
3
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'nom_table'
Sinon, il faut utiliser la commande
Code :
 SHOW COLUMNS FROM nom_table
La colonne TYPE renvoie type de la colonne.

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 22h39   #3
Invité de passage
 
Inscription : mars 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 10
Points : 2
Points : 2
merci pour ces renseignements
c'est la 5.0.5b, la dernière en titre je crois
je ne m'étais pas encore intéressé à ces informations qui apparaissent par défaut lorsqu'on consulte les bases et les tables avec un gui

je n'ai pas encore compris où ces tables sont stockées car je n'ai vu qu'une base mysql ... c'est créé dynamiquement sans doute ?

je vais me pencher sur ce nouvel aspect de mysql

yvan
yvan.chambault est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 22h42   #4
Invité de passage
 
Inscription : mars 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 10
Points : 2
Points : 2
sinon, la méthode que j'ai employée te paraît "orthodoxe" ?
y
yvan.chambault est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 09h15   #5
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 409
Points : 6 409
Citation:
Envoyé par yvan.chambault Voir le message
je n'ai pas encore compris où ces tables sont stockées car je n'ai vu qu'une base mysql ... c'est créé dynamiquement sans doute ?
Oui, c'est créé dynamiquement. Et tout utilisateur peut avoir accès aux informations du catalogue, du moment où il a les droits de lecture sur une base (il voit alors les informations du catalogue concernant cette base).

Avec la commande SHOW, ça reste les deux moyens les plus "orthodoxes" d'obtenir des informations sur une base de données .

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h25.


 
 
 
 
Partenaires

Hébergement Web