Thema: Delphi Tabellenpräfix auslesen

Einzelnen Beitrag anzeigen

Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#1

Tabellenpräfix auslesen

  Alt 17. Sep 2008, 15:43
Datenbank: MSAccess, MSSQL, MySQL, DB2, Oracle • Zugriff über: TADOConnection
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_NAMEthen
        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....

Gruß, Moony
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat