Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Tabellenpräfix auslesen (https://www.delphipraxis.net/120842-tabellenpraefix-auslesen.html)

Moony 17. Sep 2008 15:43

Datenbank: MSAccess, MSSQL, MySQL, DB2, Oracle • Zugriff über: TADOConnection

Tabellenpräfix auslesen
 
Hallo zusammen,

hab da mal wieder ein Problemchen:

Bei der Anbidung meiner Software an eine Datenbank über die ODBC Schnittstelle lese ich nach der Verbindung zur DB alle Tabellen mit TABLE_TYPE = TABLE, VIEW oder SYNONYM.

Mein Problem bezieht sich speziell auf die DB2 Datenbank, aber die Lösung sollte grundsätzlich dann für alle gelten. Beim Auslesen der Tabellennamen wird kein Tabellenpräfix ausgegeben. Wenn ich dann den SQL befehl abschickcen will, wird automatisch der Benutzer als Präfix gesetzt und somit kommt die SQL Anweisung mit einem Fehler zurück.

Meine Frage also, wie kann ich die Tabellen inklusive Präfix auslesen?

Zur Zeit hole ich mir die Tabellen folgendermaßen:
Delphi-Quellcode:
function GetDbTableNames(ConnectionStr: string; List: TStrings): Boolean;
// Schema jeder Datenbank in ODBC
// TABLE_CATALOG
// TABLE_SCHEMA
// INDEX_NAME
// TYPE
// TABLE_NAME
var
   myDB         : Variant;
  myRS         : Variant;
  SchemaOrd    : TOleEnum;
   Restrictions : OleVariant;
  SchemaID     : OleVariant;
  i            : integer;
  IDx          : integer;
begin
   try
     // Datenbank öffnen
     myDB := CreateOleObject('ADODB.Connection');
    myRS := CreateOleObject('ADODB.Recordset');
    myDB.CursorLocation  := 3;
    myDB.ConnectionString := ConnectionStr;
    myDB.Open;
    try
      // Recordset zuweisen
      SchemaOrd   := 20; // nur Tabellen
      Restrictions := EmptyParam;
      SchemaID    := EmptyParam;
      myRS        := myDB.OpenSchema(SchemaOrd, Restrictions, SchemaID);

         // IDx setzen (Feldnummer für Tabellennamen)
      IDx := -1;
      for i := 0 to myRS.RecordCount - 1 do
      begin
        if myRS.Fields[i].Name = 'TABLE_NAME' then
        begin
           IDx := i;
           Break;
        end;
      end;

      // nur die Tabellen rausfiltern
      myRS.Filter := '(TABLE_TYPE = ''TABLE'') or (TABLE_TYPE = ''VIEW'') or (TABLE_TYPE = ''SYNONYM'')';

         // Tabellen auslesen
      myRS.MoveFirst;

         if IDx = -1 then
      begin
         Result := False;
         Exit;
      end;

      while not myRS.EOF do
      begin
        List.Add(myRS.Fields[i].Value);
        myRS.MoveNext;
      end;

      Result := True;
    finally
      // Datenbank wieder freigeben
      if not (VarIsEmpty(myDB)) then
      begin
        myDB.Close;
        myDB := Unassigned;
      end;
      if not (VarIsEmpty(myRS)) then
        myRS := Unassigned;
    end;
  except
     on E:Exception do
    begin
       ErrMsg := E.Message;
      Result := False;
    end;
  end;
end;
Hoffe mir kann da jemand auf die schnelle helfen.... :wall:

Gruß, Moony

omata 17. Sep 2008 19:59

Re: Tabellenpräfix auslesen
 
Delphi-Quellcode:
procedure GetTableNames(ADOConnection:TADOConnection; List: TStrings;
                        SystemTables: Boolean = false);
var DataSet:TADODataSet;
    TypeField, NameField, SchemaField: TField;
    TableType: string;
begin
  DataSet:=TADODataSet.Create(nil);
  try
    ADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, DataSet);
    TypeField := DataSet.FieldByName('TABLE_TYPE');
    NameField := DataSet.FieldByName('TABLE_NAME');
    SchemaField := DataSet.FieldByName('TABLE_SCHEMA');
    List.BeginUpdate;
    try
      List.Clear;
      while not DataSet.Eof do begin
        TableType := TypeField.AsString;
        if   (TableType = 'TABLE')
           or (TableType = 'VIEW')
           or (SystemTables and (TableType = 'SYSTEM TABLE')) then
        begin
          List.Append(SchemaField.AsString + '.' + NameField.AsString);
        end;
        DataSet.Next;
      end;
    finally
      List.EndUpdate;
    end;
  finally
    DataSet.free;
  end;
end;

Moony 18. Sep 2008 13:36

Re: Tabellenpräfix auslesen
 
ok, danke. ich werd ausprobieren und mich zurückmelden.

Gruß, Moony


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 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