Primärschlüssel einer Access-Tabelle ermitteln

16/04/2011 - 16:11 von Frank Rothweiler | Report spam
Für eine automatisierte Datenbank-Konvertierung (Access –> Firebird)
benötige ich das Feld jeder Tabelle, das einen Primàrschlüssel
darstellt. Ich greife über die dbGO-Komponenten (ADO) auf eine
Access-Datenbank zu.

Über Feldeigenschaften ist die Information darüber, ob ein Feld ein
AutoInc-Feld ist, abrufbar:

FOR i := 0 TO ADOdataset.FieldDefs.Count -1 DO
IF ADOdataset.FieldDefs[i].DataType = ftAutoInc THEN IndexFeld := i;

in einer Schleife über alle Felder (Spaltennamen) hinweg funktioniert.

Nun gibt es aber Tabellen, die zwar einen Primàrschlüssel besitzen, aber
kein AutoInc-Feld. So z.B. wenn der Primàrschlüssel zu einem Feld mit
Artikelnummern gehört. Wie finde ich in diesem Fall heraus, welche
Spalte einer Tabelle den Primàrschlüssel darstellt?

Mittels der Attribute der Felddefinitionen ...

faHiddenCol, faReadonly, faRequired, faLink, faUnNamed, faFixed

... ist es nicht möglich, einen Primàrschlüssel zu ermitteln.

Ich habe sogar bereits mit den Units ADODB_TLB und ADOX_TLB
herumexperimentiert (generiert aus Microsoft ADO Data Conrol 6.0 bzw.
Microsoft ADO Ext. 2.8 for DLL and Security), scheitere aber an den
Attributen:

FUNCTION TDatMod.TabelleAnlegen(Sender: TObject; TabName : WideString;
VAR Ergebnis : STRING) : BOOLEAN;

VAR
Table : _Table;
Column : _Column;
Catalog : _Catalog;
i,
PrimaryFeld : INTEGER;
PrimaryFeldName : WideString;

BEGIN
Result := FALSE;
...

Catalog := CoCatalog.Create;
Catalog.Set_ActiveConnection(ADOConMain.ConnectionObject);
Table := Catalog.Tables[TabName];

FOR i := 0 TO Table.Columns.Count -1 DO
IF Column.Attributes = adKeyPrimary
THEN
BEGIN
PrimaryFeld := i;
PrimaryFeldName := Table.Columns[i].Name;
END;

...
END;

In ADOX_TLB ist definiert:

const
adKeyPrimary = $00000001;
adKeyForeign = $00000002;
adKeyUnique = $00000003;

Zur Laufzeit hat Column.Attributes den Wert 2, wenn das Feld[i] einen
Primàrschlüssel hat und gleichzeitig ein AutoInc-Feld ist. In der
anderen Tabelle, die lediglich eine Artikelnummer (LongInteger,
Primàrschlüssel) und eine Warenbezeichnung (Text (200)) enthàlt, hat die
Artikelnummer-Spalte den Attributwert 3 und die Warentext-Spalte den
Wert 2. Ich blicke da ehrlich gesagt nicht so recht durch ...
 

Lesen sie die antworten

#1 Peter
17/04/2011 - 11:34 | Warnen spam
Frank Rothweiler wrote:

Für eine automatisierte Datenbank-Konvertierung (Access –> Firebird)
benötige ich das Feld jeder Tabelle, das einen Primàrschlüssel
darstellt. Ich greife über die dbGO-Komponenten (ADO) auf eine
Access-Datenbank zu.

Über Feldeigenschaften ist die Information darüber, ob ein Feld ein
AutoInc-Feld ist, abrufbar:



Da scheint es ein Mißverstàndnis deinerseits darüber zu geben, was ein
Primàrschlüssel eigentlich ist. Du gehst davon aus, daß das irgendwie
ein Attribut einer Spalte ist. Das ist falsch. Ein Primàrschlüssel ist
ein Constraint (keine Ahnung, was das gàngige deutsche Äquivalent dafür
ist). Schließlich kann ein Primàrschlüssel aus mehreren Spalten
zusammengesetzt werden, er kann also kein Attribute einer Spalte sein.
Ein Constraint ist ein Attribute einer Tabelle.

Das ADO Table-Objekt hat eine Collection mit Namen Keys. Die dort zu
findenden Key-Objekte beschreiben die primary und foreign (und unique)
Keys der Tabelle. Eine Eigenschaft von Key ist Type (_Type in Delphi),
und das ist die Eigenschaft, die Du auf adKeyPrimary testen mußt. Key
hat auch eine Collection namens Columns, und da findest Du die Spalten,
aus denen der Key zusammengesetzt ist.

http://msdn.microsoft.com/en-us/lib...85%29.aspx



Peter Below

Ähnliche fragen