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 : 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
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;
Partager