AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TADOQuery Primary Key auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

TADOQuery Primary Key auslesen

Ein Thema von Ducksoul · begonnen am 9. Feb 2010 · letzter Beitrag vom 21. Mär 2010
Antwort Antwort
Seite 1 von 2  1 2      
Ducksoul

Registriert seit: 19. Apr 2006
Ort: Ilmenau
87 Beiträge
 
RAD-Studio 2009 Pro
 
#1

TADOQuery Primary Key auslesen

  Alt 9. Feb 2010, 10:56
Datenbank: Access • Zugriff über: ADO
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:
    ...
    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;
Wie komme ich jetzt noch an den Schlüssel ran?

(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
Franz
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: TADOQuery Primary Key auslesen

  Alt 9. Feb 2010, 11:20
Hallo,

schau Dir für den Index doch mal query_ex.indexfields an.
  Mit Zitat antworten Zitat
Ducksoul

Registriert seit: 19. Apr 2006
Ort: Ilmenau
87 Beiträge
 
RAD-Studio 2009 Pro
 
#3

Re: TADOQuery Primary Key auslesen

  Alt 9. Feb 2010, 11:51
Delphi-Quellcode:
if query_ex.IndexFieldCount <> 0 then
begin
  slTableOne.Add(query_ex.IndexFields[0].AsString);
  ShowMessage('Hallo');
end;
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?

Also ich muss zugeben, dass mir die Delphihilfe bei diesem Thema irgendwie gar nicht hilft. :-/
Franz
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: TADOQuery Primary Key auslesen

  Alt 9. Feb 2010, 12:06
Hallo,

dann nimm halt Google

Lösung.
ADO unterstützt IndexFieldCount nicht für Access.

Guggst du hier
1

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
Heiko
  Mit Zitat antworten Zitat
Ducksoul

Registriert seit: 19. Apr 2006
Ort: Ilmenau
87 Beiträge
 
RAD-Studio 2009 Pro
 
#5

Re: TADOQuery Primary Key auslesen

  Alt 10. Feb 2010, 12:19
So ich hab jetzt mal den Workaround probiert. Allerdings stelle ich mir jetzt noch die Frage was da genau passiert.

Delphi-Quellcode:
        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);
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?

Gruß
Franz
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: TADOQuery Primary Key auslesen

  Alt 10. Feb 2010, 13:15
Hallo,

Aus Google.

Zitat:
Using DAO you can look through the TableDef.Indexes collection. There is
an Index.Primary property that is true if the index is a primary key
index. You can then find the field names by looking at the fields
collection of the Index. There may be a more direct way using DAO that I
am not aware of.
Also

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
Heiko
  Mit Zitat antworten Zitat
Ducksoul

Registriert seit: 19. Apr 2006
Ort: Ilmenau
87 Beiträge
 
RAD-Studio 2009 Pro
 
#7

Re: TADOQuery Primary Key auslesen

  Alt 10. Feb 2010, 14:00
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:
        ADODataSet1.CommandText := 'SELECT * From Kunde';
        ADODataSet1.IndexName := 'Kundenschluessel';
        ADODataSet1.Active := True;
        ...
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*

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 ^^
Franz
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: TADOQuery Primary Key auslesen

  Alt 10. Feb 2010, 14:48
Hallo,

Indexname wird eigentlich nur von den TXTable benutzt.
Bei einer Query macht das keinen Sinn.


Heiko
Heiko
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: TADOQuery Primary Key auslesen

  Alt 10. Feb 2010, 14:52
Hallo,

noch ein Tip

TADOConnection.OpenSchema

TSchemaInfo = (siAsserts, ... siForeignKeys, siPrimaryKeys,

1

Es kann sein, dass die CursorLocation (clUseServer, clUseClient) noch eine Rolle spielt

-> Ausprobieren


Heiko
Heiko
  Mit Zitat antworten Zitat
Ducksoul

Registriert seit: 19. Apr 2006
Ort: Ilmenau
87 Beiträge
 
RAD-Studio 2009 Pro
 
#10

Re: TADOQuery Primary Key auslesen

  Alt 11. Feb 2010, 12:36
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ß
Franz
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz