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....
Gruß, Moony