Bonjour,

Dans la procédure ci-dessous, je tente de créer un fichier (ini pour l'exemple) qui regroupe toutes les caractéristiques d'une base de données type "Access" avec comme contraintes essentielles d'utiliser le moins possible de composants natifs "Delphi" et aucun appel au moteur "Access".
Pour la récupération des tables ainsi que des noms de champs, aucun probléme. Un composant ADOConnection me fournit les accès nécessaire. A l'heure actuelle, j'obtiens donc un fichier qui ressemble à celà :
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
[PROJ.mdb] // Nom de la base de données
 = 
// Chaîne de connection compléte
 
[ Connection String ]=Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\Program Files\Firmin\Data\PROJ.mdb;Mode=Share Deny None;Extended 
Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet 
OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt 
Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
 
 
[Cat] // nom de la table
Code = // Nom des champs tels qu'il apparaissent dans la table
CodeUnic = 
Id_1 = 
Id_2 = 
Id_3 = 
Id_4 = 
Id_5 = 
Name = 
Ptht = 
Puht = 
Quantit = 
Unit = 
 
[Cie] // la table suivante...
Code = 
CodeUnic = 
Id_1 = 
Name = 
Ptht = 
Puht = 
Quantit = 
Unit =
Pour obtenir ce fichier, j'utilise le code suivant :
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls,
  ExtDlgs, ExtCtrls,
  Db, Adodb ;
 
type
  TForm1                = class(TForm)
    OtfDlg              : TOpenTextFileDialog;
    StfDlg              : TSaveTextFileDialog;
    Editeur             : TMemo;
    Pnl1                : TPanel;
    Activebutton        : TButton;
    CloseBt             : TButton;
    SaveBt              : TButton;
    procedure SaveBtClick(Sender: TObject);
    procedure CloseBtClick(Sender: TObject);
    procedure BoutontestClick(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.BoutontestClick(Sender: TObject);
var
  i,j, k : integer;
  AConnect : TAdoconnection;
  Alist1, Alist2 : Tstringlist;
 
  S : string;
begin
    Aconnect := TAdoconnection.Create(self);
    OtfDlg.Execute;
    for i:=0 to Otfdlg.Files.Count-1 do
      begin
        if (ExtractFileExt(OtfDlg.Files.ValueFromIndex[i]) ='.mdb') then
          With Aconnect do
            begin
              loginprompt := false;
              connectionstring := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
                          'Data Source=C'+
                          OtfDlg.Files.ValueFromIndex[i]+
                          ';'+
                          'Persist Security Info=False';
              provider := 'Microsoft.Jet.OLEDB.4.0';
              connected := true;
              end;
 
      Editeur.Lines.Add('['+
                        ExtractFileName(OtfDlg.Files.ValueFromIndex[i]+']')+
                        #13+#10+
                        ' = '+
                        #10);
      Editeur.Lines.Add('[ Connection String ]'+
                        '='+
                        Aconnect.ConnectionString+
                        #13+#10);
      Alist1 := Tstringlist.Create;
      Aconnect.GetTableNames(Alist1);
        if Alist1.Count<>0 then
          for j:=0 to Alist1.count-1 do
            begin
               Alist2 := Tstringlist.Create;
               editeur.Lines.add(#13+#10+'['+
                                 Alist1.strings[j]+
                                 ']');
               Aconnect.GetFieldNames(Alist1.Strings[j],Alist2);
                if Alist2.Count<>0 then
                  for k := 0 to Alist2.Count-1 do
                    Editeur.Lines.Add(Alist2.Strings[k]+' = ');
               end;
          end;
                Alist2.Free;
                Alist1.Free;
                Aconnect.Free;
  end;
//
 
procedure TForm1.CloseBtClick(Sender: TObject);
begin
Form1.close;
end;
//
 
procedure TForm1.SaveBtClick(Sender: TObject);
begin
StfDlg.execute;
Editeur.Lines.SaveToFile(StfDlg.FileName);
end;
//
 
end.
// TO DO : Sécuriser l'utilisation de OtfDlg et StfDlg
Vous avez remarquez qu'il manque les types de champs, les index etc... Or, sans création de champs persistants, donc sans création d'un ADOTable dynamique, je n'arrive pas à accéder à ces données! N'ayant pas les sources de mes bibliothéques actuellement avec moi, je vous sollicite donc afin de m'aider à retrouver les fonctions qui me permettront d'atteindre mon objectif. (Je subodore de l'API...)
Merci par avance de toute l'aide que vous voudrez bien m'apporter.
Cordialement,
Hauwke