Entwickler-Ecke

Datenbanken - Tabellen aus Access Datenbank (*.mdb) auslesen


Ratchet - Mo 27.04.09 10:25
Titel: Tabellen aus Access Datenbank (*.mdb) auslesen
Iich würde gerne die Namen aller Tabellen und wenn möglich auch deren Spalten aus einer Access Datenbank auslesen. Es geht mir nicht um die Daten selber sondern nur um die reinen Meta-Daten der Tabellen.
Suche, hier und google, ergaben noch nichts brauchbarens.


espen - Mo 27.04.09 12:20

Hallo,

Solltest Du via ADOConnection auf die Access-DB zugreifen, empfehle ich:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// ****
// **** Tabellen
// ****
Adoconnection1.GetTableNames(List: TStrings; [Systemtables :Boolean = False]);

// ****
// **** Felder einer Tabelle
// ****
Adoconnection1.GetFieldNames(const TableName, List: TStrings);


Gruss.


Ratchet - Mo 27.04.09 13:01

Wunderbar, vielen Dank!


Regan - Mo 27.04.09 17:32

Hallo,

wenn diese Frage damit für dich "beantwortet" ist, dann markier das Thema bitte auch als solches.

MfG
Regan


IHops - Sa 20.06.09 12:57

hi, ich muss da nochmal nachfragen ...

Ich habe versucht, die Tabellennamen auszulesen und in eine Listbox einzutragen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TFrmMain.FormCreate(Sender: TObject);
var
  NameList : TStrings;
begin
  // Initialisierung
  DataModule2.ADOConnectionMain.GetTableNames(NameList);
  LBTables.Items := NameList;
end;


Beim Start des Programms erhalte ich aber eine Fehlermeldung: "Zugriffsverletzung beim Lesen ... DBDelphi.exe". Der Zugriff auf die DB ist allerdings da - in einem DBGrid wird eine Tabelle angezeigt.

Woran kann das liegen?


espen - Mo 22.06.09 11:39

Hallo,

das liegt wohl daran, dass Du versuchst, die Tabellennamen während des FormCreate-Ereignisses zu ermitteln.
Versuche es mal mit FormActivate().

Grüßle.


BenBE - Mo 22.06.09 11:42

NameList ist uninitialisiert. Bite zuerst eine TStringList erzeugen, dann diese übergeben und dann nicht an das Property zuweisen, sondern mit Items.Assign(NameList) kopieren.


Delete - Mo 22.06.09 12:18

Wozu die Stringliste, Du hast doch bereits eine?

Delphi-Quelltext
1:
DataModule2.ADOConnectionMain.GetTableNames(LBTables.Items);                    


BenBE - Mo 22.06.09 12:22

Bliebe immer noch als Alternative. Wollte hauptsächlich erstmal überhaupt auf den Fehler hinweisen, Optimieren kann man später immer noch ^^


ub60 - Mo 22.06.09 16:55

Mal noch so für die Metadaten, hier ein Quelltext für die Feldtypen:


Delphi-Quelltext
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:
var i : Integer;
    Felddefinition : TFieldDef;
    Feldname, FeldTypStr : String;
    Feldtyp : TFieldType;
    Feldgroesse : Integer;
begin
  ADOConnection1.Open;
  Adoconnection1.GetTableNames(ListBox1.Items);
  Adoconnection1.GetFieldNames('Tabellenname', ListBox2.Items);
  for i:=1 to ADOTable1.FieldDefs.Count do
    begin
      Felddefinition:=ADOTable1.FieldDefs[i-1];
      Feldname:=Felddefinition.Name;
      Feldtyp:=Felddefinition.DataType;
      Feldgroesse:=Felddefinition.Size;
      case Feldtyp of
        ftString      : FeldTypStr:='String';
        ftDate        : FeldTypStr:='Datum';
        ftBoolean     : FeldTypStr:='Boolean';
        ftFloat       : FeldTypStr:='Float/Double';
        ftUnknown     : FeldTypStr:='Unbekannt oder nicht definiert';
        ftSmallint    : FeldTypStr:='16-Bit-Integer';
        ftInteger     : FeldTypStr:='32-Bit-Integer';
        ftWord        : FeldTypStr:='Vorzeichenloser 16-Bit-Integer';
        ftCurrency    : FeldTypStr:='Währungsfeld';
        ftBCD         : FeldTypStr:='Binärcodiertes Dezimalfeld, das ohne Präzisionsverlust in ein Währungsfeld konvertiert werden kann';
        ftTime        : FeldTypStr:='Zeitfeld';
        ftDateTime    : FeldTypStr:='Datums-/Zeitfeld';
        ftBytes       : FeldTypStr:='Feste Bytezahl (binäre Speicherung)';
        ftVarBytes    : FeldTypStr:='Variable Bytezahl (binäre Speicherung)';
        ftAutoInc     : FeldTypStr:='32-Bit-Integer-Zählerfeld';
        ftBlob        : FeldTypStr:='BLOB-Feld (Binary Large OBject)';
        ftMemo        : FeldTypStr:='Textmemofeld';
        ftGraphic     : FeldTypStr:='Bitmapfeld';
        ftFmtMemo     : FeldTypStr:='Memofeld für formatierten Text';
        ftParadoxOle  : FeldTypStr:='Paradox-OLE-Feld';
        ftDBaseOle    : FeldTypStr:='dBASE-OLE-Feld';
        ftTypedBinary : FeldTypStr:='Typisiertes Binärfeld';
        ftCursor      : FeldTypStr:='Ausgabecursor einer Stored Procedure von Oracle (nur TParam)';
        ftFixedChar   : FeldTypStr:='Zeichenfeld fester Länge';
        ftWideString  : FeldTypStr:='Langes Stringfeld';
        ftLargeint    : FeldTypStr:='Großes Integerfeld';
        ftADT         : FeldTypStr:='Feld für abstrakte Datentypen';
        ftArray       : FeldTypStr:='Arrayfeld';
        ftReference   : FeldTypStr:='REF-Feld';
        ftDataSet     : FeldTypStr:='Datenmengenfeld';
        ftOraBlob     : FeldTypStr:='BLOB-Felder in Oracle 8-Tabellen';
        ftOraClob     : FeldTypStr:='CLOB-Felder in Oracle 8-Tabellen';
        ftVariant     : FeldTypStr:='Daten eines unbekannten oder nicht definierten Typs';
        ftInterface   : FeldTypStr:='Schnittstellenreferenzen (IUnknown)';
        ftIDispatch   : FeldTypStr:='IDispatch-Schnittstellenreferenzen';
        ftGuid        : FeldTypStr:='GUID-Werte (Globally Unique IDentifier)';
        ftTimeStamp   : FeldTypStr:='Datums-/Zeitfeld, auf das über DBExpress zugegriffen wird';
        ftFMTBcd      : FeldTypStr:='Feld für binärcodierte Dezimalwerte, die für ftBCD zu groß sind';
      end;           
                     
      StringGrid1.Cells[0,i]:=Feldname;
      StringGrid1.Cells[1,i]:=FeldTypStr;
      StringGrid1.Cells[2,i]:=IntToStr(Feldgroesse);
    end;
end;

ub60


IHops - Mo 22.06.09 18:16

Vielen Dank für die schnelle Hilfe ... es lag wohl daran, dass es in der FormCreate passieren sollte. Hab es nun in die Table.Open rein geschrieben - geht super ...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TDataModule2.ADOTable1AfterOpen(DataSet: TDataSet);
begin
  // alle Tabellen angeben
  ADOConnectionMain.GetTableNames(Unit1.FrmMain.LBTables.Items);
  // alle Felder der gewählten Tabelle angeben
  ADOTable1.GetFieldNames(Unit1.FrmMain.LBFields.Items);
end;