Tabellenstrukturen in einer Verwaltungstabelle ablegen

Der folgende Beitrag dient dazu Informationen über die diversen Felder in den Tabellen Ihrer Datenbank in einer Verwaltungstabelle abzuspeichern, um einerseits Informationen zu haben, welche Felder es gibt, andererseits um festzustellen, welche durch das Programm erzeugt worden sind und welche benutzerspezifisch sind.

Natürlich haben die meisten Datenbanken Ihr eigenes Dictionary, aber diese enthalten  immer alle Informationen über Felder / Indizes – egal, ob die Felder von Ihnen bzw.  dem Programm oder dem Anwender hinzugefügt worden sind.

Um diesen Problem in den Griff zu bekommen, lohnt sich die Anlage einer eigenen Tabelle  ‚Verwaltung‘, die wie folgt aufgebaut ist:

Tabelle: String, 80
Feldname: String, 80
Feldtyp: String, 20
Feldlaenge: Integer

Dies kann natürlich an Ihre Gegebenheiten angepasst oder erweitert werden,  je nachdem welche Infos Sie aufnehmen möchten.

Nachdem die Tabellen Ihrer Datenbank angelegt sind, führen Sie folgenden Code aus.  Dieser Code (Basis, aber ausbaufähig) prüft, ob schon Informationen in ‚Verwaltung‘ abgelegt sind. Wenn nicht, so wird die Datenbank (hier eine Nexus-DB) gescannt und alle Informationen über Tabellen + Felder der Verwaltungstabelle hinzugefügt:

procedure Checkverwaltung;
var mytable:TnxTable; tableList:TStringlist; i,x:Integer;
_datasize: Integer;
begin

tableVerwaltung.open; // unsere Verwaltungstabelle
tableverwaltung.First;
if tableverwaltung.eof then  // noch keine Tabelleninformationen vorhanden, also scannen + einlesen
begin
tableList:=TStringlist.create;   // speichert die Tabellennamen
DatabaseVeox.GetTableNames( TableList );
// Nexus-spezifisch, prüfen Sie bei Ihrer DB, wie Sie eine Liste aller
// enthaltenen Tabellen erhalten;

for i := 0 to TableList.Count – 1 do
begin
mytable:=TnxTable.Create(nil);           // Tabelle dynamisch erzeugen
mytable.TableName:=tableList.Strings[i];
mytable.Database:=DatabaseVeox;
mytable.name:=tableList.Strings[i];
mytable.Open;
for x := 0 to mytable.FieldCount – 1 do
begin
tableVerwaltung.Insert;
tableVerwaltung.FieldByName(‚tabelle‘).AsString:=mytable.Name;
tableVerwaltung.FieldByName(‚Feldname‘).AsString:=mytable.Fields[x].FieldName;
case mytable.Fields[x].DataType of
ftGuid: tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’Guid‘;
ftAutoInc: tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’Autoinc‘;
ftDate: tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’Date‘;
ftDateTime: tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’Datetime‘;
ftFloat: tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’Float‘;
ftInteger: tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’Integer‘;
ftMemo: tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’Memo‘;
ftString: tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’String‘;
// weitere Feldtypen fall nötig hinzufügen
else
tableVerwaltung.FieldByName(‚Feldtyp‘).AsString:=’Unknown‘;
end;
_datasize:=mytable.Fields[x].DataSize;
if mytable.Fields[x].DataType=ftString then
Dec(_datasize);
// Datasize ist bei Stringtypen immer +1 als die tatsächliche Größe
// generell oder nur bei NexusDB?
tableVerwaltung.FieldByName(‚Feldlaenge‘).AsInteger:=_datasize;

tableVerwaltung
.post;
end;
mytable.Close;
mytable.Free;
end;
tableVerwaltung.close;
tablelist.Free;
end;
end;

Datasize,  Datatype, fieldname… sollten bei allen DB unter Delphi funktionieren

Fügen Sie zu einem späteren Programm neue Datenbankfelder (oder Änderungen) ein (durch),  so aktualisieren Sie die Verwaltungstabelle entsprechend. Vom Benutzer hinzugefügte Felder werden dagegen nicht gespeichert, so dass immer eine saubere Trennung möglich ist.

Ebensfalls erweitern könnte man obiges Beispiel noch um Try…Except – Blöcke, um mögliche Probleme abzufangen. Ebenso beinhaltet obiges Beispiel noch keine Indexfeld-Informationen, ist also noch ausbaufähig.

Eine solche Tabelle kann dann natürlich auch prima dazu dienen, um entsprechende Prüfroutinen einzubauen, ob alle notwendigen Felder beim Kunden vorhanden sind und natürlich auch als Ausgangsbasis für Datenbank- / Tabellenerweiterungen.

Aktuelle Top Aktionen bei Acer, HP, Lenovo, Bitdefender & Co

Notebook & PC Angebote:
» HP Extra Aktion: 100 Euro Extra sparen bei HP Notebooks ab 999 Euro. Gutscheincode und alle Infos hier im HP Store
» Top bei Otto: Sehr gute HP Notebook Angebote mit Extras wie 4 Jahre Garantie und mehr
» Aktion im Lenovo Store: Bis zu 15% auf ausgewählte und recht gute Artikel (IdeaPad und Yoga Notebooks, Tablet PCs, Gaming Notebooks und PCs)
» Große Rabattaktion bei Acer: bis 21.05.2018 gibt es 15% Rabatt auf ultraschlanke Notebooks der Acer Swift Serie
» Notebooksbilliger.de WM Special:Jede Woche 11 neue Top Angebote>
» Mehr Aktionen in der Übersicht: Aktuelle HP Angebote und mehr auf einem Blick

Aktuelle Bitdefender Aktionen:
» Neue Aktion: Bitdefender 39 Euro Flat mit 5 Geräten
» Bitdefender +1 Jahr dazu-Aktion
» Die neue Bitdefender 40% und mehr Rabatt Aktion
» Top für neue PCs! Bitdefender Internet Security 2018 PC Lebenslang Edition: 5 Jahre Schutz für nur für nur 89,95

Weitere aktuelle Bitdefender Angebote » Alle Bitdefender Angebote auf einem Blick


Verwandte Themen:


Sorry! Unser Kommentarfunktion ist vorübergehend geschlossen.