AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

Ein Thema von Perlsau · begonnen am 30. Dez 2014 · letzter Beitrag vom 30. Dez 2014
Antwort Antwort
Seite 1 von 2  1 2   
Perlsau
(Gast)

n/a Beiträge
 
#1

XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 07:24
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDac
Moin allerseits

Ich will mein IbDac zurück

Seit ein paar Tagen arbeite ich nun remote an einem Rechner im Ruhrgebiet, bis der Programmierer Mitte Januar aus'm Urlaub zurück ist. Im Verlauf des Projekts muß ich alle Tabellen zahlreicher Datenbanken verschiedenster DBMS auslesen, analysieren und die so gewonnenen Daten sichern, was ich im Falle einer Firebird-DB mit TFDConnection.GetTableNames versucht habe:

Delphi-Quellcode:
Function TInfoFireBird.Tabellen: Boolean;
Var
  Liste : TStrings;

begin
  Liste := TStrings.Create;
  Try
    Try
      FBCon.GetTableNames('','','',Liste,[osMy],[tkTable]);
Das liefert mir leider eine Fehlermeldung zurück, obwohl die Syntax korrekt zu sein scheint (kein Compilerfehler):
Im Projekt ****.exe ist eine Exception der Klasse EAbstractError mit der Meldung 'Abstrakter Fehler' aufgetreten.

Die drei leeren Strings sollen "normalerweise" beinhalten:
ACatalogName, ASchemaName beschränken Tabellennamen auf den Katalog und das Schema.
APattern ist das LIKE-Muster zum Filtern der Tabellennamen.


Wenn ich als APattern das Like-Zeichen % eintrage, kommt dieselbe Fehlermeldung:
FBCon.GetTableNames('','','%',Liste,[osMy],[tkTable]); Katalog- und Schemanamen gibt es ja bei Firebird nicht, das sind glaub ich Begriffe aus MySQL bzw. MsSQL

Falls ich den Rechner dort zum Absturz bringe, muß ich den Nachbarn anrufen, der die Kiste dann neu startet
Das muß ich natürlich unter allen Umständen vermeiden, ist ja quasi eine Bewährungsprobe


Die Verbindungsfunktion sieht so aus:
Delphi-Quellcode:
Function TInfoFireBird.Verbinden: Boolean;
begin
  Try
    FBCon.Connected := False;
    FBCon.Params.Clear;
    FBCon.Params.Append('DriverID=FB');
    FBCon.Params.Append('CharacterSet=UTF8');
    FBCon.Params.Append('Database=' + DateiName);
    FBCon.Params.Append('User_Name=' + DBI.DbUser);
    FBCon.Params.Append('Password=' + DBI.DbPass);
    FBCon.Params.Append('ExtendedMetadata=True');
    FBCon.DriverName := 'FB';
    FBCon.Connected := True;
    Result := True;
  Except
    on e:exception Do
    Begin
      Result := False;
      Fehlertext := 'Fehler bei Verbindung mit "' + DateiName + '": ' + e.Message;
    End;
  End;
end;
In der Hilfe ist ein Fehler: Die Syntax der Methode wird mit drei Strings als Parameter dargestellt, unten im Beispiel werden jedoch vier leere Strings als Parameter übergeben. Drei sind aber richtig, bei vieren kommt ein Compilerfehler.

Geändert von Perlsau (30. Dez 2014 um 07:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
776 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 07:33
Hilft zwar nicht konkret bei deinem Problem, aber hast du schon versucht, die Tabellennamen über die Metadaten zu ermitteln. Siehe z.B. hier.

Grüße
Michael
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.258 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 07:43
Hi,

EAbstractError deutet ja darauf hin, dass das Programm versucht eine Methode einer KLasse aufzurufen, die nicht implementiert ist (in einer abgeleiteten Klasse eine in der Elternklasse als abstract; eingeführte Methode). D.h. Du kannst da vermutlich übergeben was Du willst - ich vermute, dass der Weg der falsche ist... Sind die FireDAC Sourcen bei dir dabei? Dann könntest Du mal durchdebuggen und schauen wo es knallt.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 08:01
Hilft zwar nicht konkret bei deinem Problem, aber hast du schon versucht, die Tabellennamen über die Metadaten zu ermitteln. Siehe z.B. hier.
Moin Mikhal, das war mein nächster Gedanke. Allerdings weiß ich noch nicht, ob dieser Weg die Unterscheidung zwischen Tabellen und Views ermöglicht ... Mit GetTableNames soll das ja angeblich gehen ...

Hi, EAbstractError deutet ja darauf hin, dass das Programm versucht eine Methode einer KLasse aufzurufen, die nicht implementiert ist (in einer abgeleiteten Klasse eine in der Elternklasse als abstract; eingeführte Methode). D.h. Du kannst da vermutlich übergeben was Du willst - ich vermute, dass der Weg der falsche ist... Sind die FireDAC Sourcen bei dir dabei? Dann könntest Du mal durchdebuggen und schauen wo es knallt.
Moin Lemmy, das werd ich jetzt gleich mal versuchen ... So, jetzt weiß ich mehr:

In der Unit FireDAC.Comp.Client knallt es in der procedure TFDCustomConnection.GetTableNames, und zwar nach dem zweiten Try beim Versuch, die übergebene Liste zu leeren: AList.Clear; (Zeile 4764). Was stimmt denn mit meiner Liste nicht?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 08:05
**hüstel**

Schau mal in die Doku Delphi-Referenz durchsuchenTStrings

Du willst bestimmt eine Delphi-Referenz durchsuchenTStringList-Instanz erzeugen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 08:09
Mithüstel

Natürlich muß es heißen Liste := TStringList.Create;

Danke, Sir Rufo, Du bist einfach unersetzlich

Achso: Jetzt geht's natürlich
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird : Parameter?

  Alt 30. Dez 2014, 08:50
Die Sache ist allerdings noch nicht ganz gegessen: Wenn ich eine Datenbank angebe, die überprüft 17 Tabellen besitzt, bleibt die Liste dennoch leer. Leider ist die Dokumentation der Parameter von GetTableNames äußerst dürftig. Dennoch hab ich herausgefunden, daß man sich vom TFDPhysObjectScopes osMy nicht beirren lassen darf, denn damit erhält man 0 Tabellen, zumindest in allen Firebird-Datenbanken, die ich eben mal kurz damit getestet habe. Man muß dagegen osOther angeben, womit man die selbst angelegten Tabellen erfaßt. Vielleicht bedeutet das My ja, daß es für MySQL-Datenbanken gilt und nicht "my tables" So von wegen intuitiv und so ...

Erwähnt sei das Ganze sozusagen der Vollständigkeit halber, wenn da mal jemand das gleiche Problem hätte ...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
16.754 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 10:09
Hat wirklich der User die Tabellen angelegt oder sieht er sie nur?
http://docwiki.embarcadero.com/Libra...y.ObjectScopes

Bei MySQL könnte ich mir auch vorstellen das hier je nach Version die Kennzeichnung "Diese Tabelle hat der eingelockte User angelegt" nicht eindeutig/stabil bestimmbar ist.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 11:08
Das weiß ich nicht, den mit osMy werden keine Tabellen gezählt. Muß ich mal bei mir zu Hause testen, derzeit meldet sich die Anwendung bei den diversen Datenbanken, die gezählt und analysiert werden sollen, natürlich mit SYSDBA und MASTERKE (bzw. mit den entsprechend geänderten Zugangsdaten, die ich hier aber nicht verrate ) an, sonst müßte man ja erstmal alle Tabellen händisch durchgehen und die jeweiligen Zugangsdaten eingeben, von denen ich derzeit gar nicht weiß, wo mein Auftraggeber sie abgelegt hat.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: XE7 FireDac TFDConnection.GetTableNames auf Firebird = abstract error

  Alt 30. Dez 2014, 11:22
Eine gänge Alternative sollte wohl [osMy, osOther] sein, dann bekommt man auf jeden Fall alle Tabellen ausgenommen die SystemTabellen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf