Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TADOQuery Primary Key auslesen (https://www.delphipraxis.net/147457-tadoquery-primary-key-auslesen.html)

hoika 11. Feb 2010 12:33

Re: TADOQuery Primary Key auslesen
 
Hallo,

du setzt try finally irgendwie nicht richtig ein.

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

  DS := TADODataSet.Create(nil);
  try
    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;

Heiko

Ducksoul 11. Feb 2010 14:18

Re: TADOQuery Primary Key auslesen
 
Ja das war ein kleiner Denkfehler, welcher schon behoben ist.

Danke trotzdem :)

Ducksoul 15. Feb 2010 13:32

Re: TADOQuery Primary Key auslesen
 
Hallo,
ich möchte nochmal eine überarbeitete Version der Funktionen einstellen, da oben genannte nicht zu 100% funktioniert haben.

Delphi-Quellcode:
(* Primärschlüssel auslesen                                                  *)
function Timport_form.GetPrimaryKeys : String;
var
  Filter: OLEVariant;
  DS: TADODataSet;
  Field: TField;
begin
  result := '';
  Filter := VarArrayOf([NULL, NULL, Table]);
  DS := TADODataSet.Create(nil);
  try
    DS.Connection := dbcon;
    dbcon.OpenSchema(siPrimaryKeys, Filter, EmptyParam, DS);

    Field := DS.FindField('COLUMN_NAME');
    DS.First;

    while not DS.EOF do
    begin
      result := result + '#' + Field.AsString + ', ';
      DS.Next;
    end;
    result := Copy(result, 0, Length(result)-2);
  finally
    DS.Free;
  end;
end;

Delphi-Quellcode:
(* Fremdschlüssel auslesen                                                   *)
function Timport_form.GetForeignKeys : String;
var
  Filter: OLEVariant;
  DS: TADODataSet;
  fTable1, fTable2, fColumn1, fFKName: TField;
  i: integer;
begin
  result := '';
  DS := TADODataSet.Create(nil);

  try
    DS.Connection := dbcon;
    dbcon.OpenSchema(siForeignKeys , EmptyParam, EmptyParam, DS);
    fTable1 := DS.FindField('PK_TABLE_NAME');
    fColumn1 := DS.FindField('PK_COLUMN_NAME');
    fTable2 := DS.FindField('FK_TABLE_NAME');
    fFKName := DS.FindField('FK_NAME');

    DS.First;
    while not DS.Eof do
    begin
      if SameText(fTable1.AsString, Table) then
      begin
        result := result + '~' + fFKName.AsString + ', ' +
          fColumn1.AsString + ', ' + fTable2.AsString + ', ';
      end;
      DS.Next;
    end;
      result := Copy(result, 0, Length(result)-2);
  finally
    DS.Free;
  end;
end;

Diese beiden Funktionen funktionieren bis auf eine Kleinigkeit ausgezeichnet: Mir werden nur die Fremdschlüssel angezeigt, von denen aus eine Beziehung referenziert wird. Durchsuche ich eine Tabelle, auf die referenziert wird, dann liefert die Funktion GetForeignKeys kein Ergebnis. Jemand ne Ahnung, wie ich auch die importierten Keys bekomme?


Gruß

hoika 15. Feb 2010 13:38

Re: TADOQuery Primary Key auslesen
 
Hallo,

Zitat:

Durchsuche ich eine Tabelle, auf die referenziert wird, dann liefert die Funktion GetForeignKeys kein Ergebnis. Jemand ne Ahnung, wie ich auch die importierten Keys bekomme
Das ist auch richtig so.

Um herauszufinden, ob und wie eine Tabelle referenziert ist,
musst du wohl oder übel alle Foreign Keys durchlaufen
und nach der Zieltabelle suchen.


Heiko

Ducksoul 15. Feb 2010 14:07

Re: TADOQuery Primary Key auslesen
 
Ah Mensch... Das artet ja in Arbeit aus.

Danke

hoika 15. Feb 2010 15:37

Re: TADOQuery Primary Key auslesen
 
Hallo,

ist eine klitzekleine Schleife,
den Rest macht doch der Computer ... ;)


Heiko

Reibi 21. Mär 2010 15:00

Re: TADOQuery Primary Key auslesen
 
Hallo Ducksoul,

vielen Dank für deine Funktion.
An der Sache mit dem 'Primary Key' beiße ich mir schon seit Tagen die Zähne aus.

Nur, warum benutzt Du eine Schleife um das DS auszulesen?

Code:
    DS.First;

    while not DS.EOF do
    begin
      result := result + '#' + Field.AsString + ', ';
      DS.Next;
    end;
    result := Copy(result, 0, Length(result)-2);
Pro Tabelle (MS-SQL 2005) kann es doch nur einen Primary Key geben oder liege ich da falsch?

DeddyH 21. Mär 2010 15:09

Re: TADOQuery Primary Key auslesen
 
Ein PK kann aber aus mehreren Feldern zusammengesetzt sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 Uhr.
Seite 2 von 2     12   

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