![]() |
Datenbank: Access • Zugriff über: ADO
TADOQuery Primary Key auslesen
Hallo,
beim Auslesen der Tabellenstruktur in der Datenbank bin ich auf das Problem gestoßen, dass ich nicht an den Primary Key herankomme. Die Daten werden bis jetzt wie folgt ausgelesen:
Delphi-Quellcode:
Wie komme ich jetzt noch an den Schlüssel ran?
...
i := 0; slCodeMaster := TStringlist.Create; slTableOne := TStringlist.Create; ExtractConstantIntoStringList(CodeMaster, slCodeMaster); query_ex.SQL.Clear; query_ex.SQL.Add('SELECT * FROM Kunde'); query_ex.Open; query_ex.First; while not query_ex.Eof do begin slTableOne.Add(query_ex.Fields[i].DisplayName); slTableOne.Add(FieldTypeToString(query_ex.Fields[i].DataType)); slTableOne.Add(IntToStr(query_ex.Fields[i].Size)); Inc(i); query_ex.Next; end; (Und vielleicht noch nebenbei. Gibt es eine Möglichkeit TFieldType in String umzuwandeln? Ich musste mir dafür jetz ne eigene Funktion schreiben, aber ich bin sicher dass das auch anders geht. :)) Vielen Dank für eure Hilfe Franz |
Re: TADOQuery Primary Key auslesen
Hallo,
schau Dir für den Index doch mal query_ex.indexfields an. |
Re: TADOQuery Primary Key auslesen
Delphi-Quellcode:
Müsste nicht, wenn ich diesen Code in der Schleife einfüge, zumindest mal eine Msg mit 'Hallo' aufloppen? Sonst würde es doch bedeuten, dass es keine Indexfelder gibt?
if query_ex.IndexFieldCount <> 0 then
begin slTableOne.Add(query_ex.IndexFields[0].AsString); ShowMessage('Hallo'); end; Also ich muss zugeben, dass mir die Delphihilfe bei diesem Thema irgendwie gar nicht hilft. :-/ |
Re: TADOQuery Primary Key auslesen
Hallo,
dann nimm halt Google ;) Lösung. ADO unterstützt IndexFieldCount nicht für Access. Guggst du hier ![]() Suche dort nach IndexFieldCount. Dort steht auch ein möglicher Workaround (IndexDef). Einen anderen hatte ich vor kurzem gepostet. Suche mal nach MetaData Access (in Google). Heiko |
Re: TADOQuery Primary Key auslesen
So ich hab jetzt mal den Workaround probiert. Allerdings stelle ich mir jetzt noch die Frage was da genau passiert.
Delphi-Quellcode:
Er springt gar nich in die if-Schleife rein. Allerdings kann ich auch nicht so ganz nachvollziehen was IndexName eigentlich ist. Wie muss ich das jetzt noch anpassen, dass mir auch der Primärschlüssel ausgegeben wird?
ADODataSet1.CommandText := 'SELECT * From Kunde';
ADODataSet1.Active := True; if ADODataSet1.IndexName <> '' then begin ADODataSet1.IndexDefs.Update; IndexDef := ADODataSet1.IndexDefs.Find(ADODataSet1.IndexName); if IndexDef <> nil then FList := IndexDef.Fields else FList := ''; end; ShowMessage(FList); Gruß |
Re: TADOQuery Primary Key auslesen
Hallo,
Aus Google. Zitat:
Delphi-Quellcode:
ADODataSet1.CommandText := 'SELECT * From Kunde';
ADODataSet1.Active := True; ADODataSet1.IndexDefs.Update; for i:= 0 to ADODataSet1.IndexDefs.Count-1 do begin IndexDef:= ADODataSet1.IndexDefs[i] if IndexDef.Primary ... Heiko |
Re: TADOQuery Primary Key auslesen
Hey,
das was dort beschrieben wurde behandelt DAO Komponenten. Das Ding ist nun allerdings, dass die Software grade komplett von DAO auf ADO umgestellt wird. IndexDef besitzt bei ADO also leider keine Property namens 'Primary'. Ich habe jetzt meinen Code wie folgt geändert:
Delphi-Quellcode:
Ich komm mit dem Begriff index und Indexname dummerweise nicht klar, was wohl auch der Grund ist warum ich die Hilfe so schlecht verstehe *g*
ADODataSet1.CommandText := 'SELECT * From Kunde';
ADODataSet1.IndexName := 'Kundenschluessel'; ADODataSet1.Active := True; ... Was muss da bei Indexname hin? Der Spaltenname oder 'Primary' oder was? Inzwischen fühl ich mich genötigt mich für meine Begriffsstutzigkeit zu entschuldigen: Sry ^^ |
Re: TADOQuery Primary Key auslesen
Hallo,
Indexname wird eigentlich nur von den TXTable benutzt. Bei einer Query macht das keinen Sinn. Heiko |
Re: TADOQuery Primary Key auslesen
Hallo,
noch ein Tip TADOConnection.OpenSchema TSchemaInfo = (siAsserts, ... siForeignKeys, siPrimaryKeys, ![]() Es kann sein, dass die CursorLocation (clUseServer, clUseClient) noch eine Rolle spielt -> Ausprobieren Heiko |
Re: TADOQuery Primary Key auslesen
Hallo,
deine Hilfe hat mich schon um einiges weitergebracht. Inzwischen habe ich folgende zwei Funktionen:
Delphi-Quellcode:
function Timport_form.RetrievePrimaryKeys : String;
var Filter: OLEVariant; DS: TADODataSet; i: Integer; begin result := ''; Filter := VarArrayCreate([0, 2], varVariant); Filter[2] := 'Stammdata'; // Tabellenname der zu prüfenden Tabelle try DS := TADODataSet.Create(nil); DS.Connection := adocon_ex; adocon_ex.OpenSchema(siPrimaryKeys, Filter, EmptyParam, DS); DS.Active := True; with DS do for i := 0 to Pred(Fields.Count) do begin if (Fields[i].DisplayName = 'COLUMN_NAME') and (Fields[i].DisplayText <> '') then result := '#' + Fields[i].DisplayText; // übergibt PrimaryKey end; finally DS.Free; end; end;
Delphi-Quellcode:
function Timport_form.RetrieveForeignKeys : String;
var Filter: OLEVariant; DS: TADODataSet; i: Integer; begin result := ''; Filter := VarArrayCreate([0, 2], varVariant); Filter[2] := 'Stammdata'; // Tabellenname der zu prüfenden Tabelle try DS := TADODataSet.Create(nil); DS.Connection := adocon_ex; adocon_ex.OpenSchema(siForeignKeys, Filter, EmptyParam, DS); DS.Active := True; with DS do for i := 0 to Pred(Fields.Count) do begin if (Fields[i].DisplayName = 'PK_COLUMN_NAME') and (Fields[i].DisplayText <> '') then result := '#' + Fields[i].DisplayText + ', '; // übergibt PrimaryKey, falls gleichzeit FK if (Fields[i].DisplayName = 'FK_TABLE_NAME') and (Fields[i].DisplayText <> '') then result := result + Fields[i].DisplayText + ', '; // übergibt Tabellennamen FK if (Fields[i].DisplayName = 'FK_COLUMN_NAME') and (Fields[i].DisplayText <> '') then result := result + Fields[i].DisplayText + ', '; // übergibt Spalte FK end; result := Copy(result, 0, Length(result)-2); finally DS.Free; end; end; Ich hoffe dass das jetzt alles soweit klappt. Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz