Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird Datenbank - Verbindungsaufnahme (https://www.delphipraxis.net/66239-firebird-datenbank-verbindungsaufnahme.html)

toyoman 27. Mär 2006 10:10

Datenbank: Firebird • Version: 7 • Zugriff über: ADO

Firebird Datenbank - Verbindungsaufnahme
 
Hallo

Kann mir jemand sagen mit welchen Komponenten ich die Firebird Datenbank einbinde?
Bin mich von SQL Servern her gewöhnt mit den ADO Komponenten zu arbeiten. Funktioniert auch mit Firebird, aber irgendwie nicht stabil bzw. nur teilweise.
Ich kriege z.b. beim Aufbauen der Verbindunge (Open) immer folgende Fehlermeldung:
"Exception der Klasse EVariantTypeCastError aufgetreten. Meldung: "Variante des Typs (Null) konnte nicht in Typ (String) konvertiert werden".
Weiss nicht was der da konvertieren will. Ich will lediglich die Verbindung öffnen und den SQL ausführen. Nach Bestätigung der Fehlermeldung mit OK und nochmaligem START des Programms läufts dann zwar. Allerdings sobald ich Filtere oder ähnliches krieg ich dann BLOB Fehlermeldungen und zum Teil läuft dann gar nix mehr. Bis ich Delphi geschlossen und wieder geöffnet habe.

Gibt es eine schlauere Art eine Verbindung zu Firebird aufzubauen als über die ADO Connection und die ADO Query Komponente?

Merci für die Hilfe.

toyoman

mkinzler 27. Mär 2006 10:18

Re: Firebird Datenbank - Verbindungsaufnahme
 
Adobietetsich nur für Access oder SQLServer an. Für FireBird gibt esverschiedene Alternativen. Kannst du auf spezielle Features der beueren FB-Versionen verzichten kannst di IBX verwenden, sonst funktionieren die ZeosLib (fb unabhaängig da an JDBC angelehnt), UIB(Unified InterBase) oder MDO(Mercury Database Objects) recht gut.

toyoman 27. Mär 2006 10:35

Re: Firebird Datenbank - Verbindungsaufnahme
 
Zitat:

Zitat von mkinzler
Adobietetsich nur für Access oder SQLServer an. Für FireBird gibt esverschiedene Alternativen. Kannst du auf spezielle Features der beueren FB-Versionen verzichten kannst di IBX verwenden, sonst funktionieren die ZeosLib (fb unabhaängig da an JDBC angelehnt), UIB(Unified InterBase) oder MDO(Mercury Database Objects) recht gut.

merci. werde mal versuchen diese komponenten zu installieren. weisst du grad wie ich die packages von MDO installieren muss? habs irgendwie installiert, hab aber keine neuen komponenten in der liste bekommen... installationsanleitung ist irgendwie keine dabei...

micha453 27. Mär 2006 10:37

Re: Firebird Datenbank - Verbindungsaufnahme
 
Hallo toyoman,

Firebird sprichst Du über die ADO-Komponenten an, dass ist erstmal richtig. Aufpassen musst Du, wenn Dein Programm zu "früh" gestartet wird. Firebird muss erst gestartet sein. Ich hatte anfangs auch Probleme. Verschiedene Sachen sind in Firebird auf den ersten Blick unlogisch oder fremd. So musst Du aufpassen, wie Du Gleitkommazahlen übergibst. Diese müssen an Stelle des Kommas einen Punkt haben (Englische Schreibweise!). Bei Strings muss die Länge mit der Datenfeldlänge passen. Das SQL ist auch zum Teil etwas anders als auf dem Windows SQL Server. Problematisch sind meistens UPDATE's. Deinen Fehler "Variante des Typs (Null) konnte nicht in Typ (String) konvertiert werden" deute ich als Datentyp-Konvertierungsfehler. Leider hatte ich diese Meldung noch nicht, um Dir helfen zu können. Wenn Du eine Abfrage ausführst musst Du beachten, dass das Query zu Beginn geschlossen ist, sonst gibt es einen Fehler. Manchmal "holst" Du Dein Abfrageergebnis mit OPEN und manchmal mit EXCESSQL. Das hängt vom SQL-Befehl ab.
Ich mach es so:

Ein Delete:

befehl := 'Delete from tblImport where OBJNR = 99999';
dmDisplay.qryBefehl.close;
dmDisplay.qryBefehl.Sql.clear;
dmDisplay.qryBefehl.SQL.Add(befehl);
dmDisplay.qryBefehl.ExecSQL;
dmDisplay.qryBefehl.Close;

Ein Select:

befehl := 'Select distinct belnr from tblImport';
dmDisplay.qryBefehl.close;
dmDisplay.qryBefehl.Sql.clear;
dmDisplay.qryBefehl.SQL.Add(befehl);
dmDisplay.qryBefehl.Open;
While not dmDisplay.qryBefehl.Eof do begin
anzlfs := anzlfs + 1;
dmDisplay.qryBefehl.Next;
end;
dmDisplay.qryBefehl.Close;

(dmDisplay ist ein Datenmodul, wo alle Datenbankzugriffskomponenten zentral liegen, um von allen Programm-Units zugreifen zu können. qryBefehl ist ein ADO-Query)

Ich hoffe, Dir hilft es. Die ADO-Komponenten sind in jedem Falle richtig.

Micha

mkinzler 27. Mär 2006 10:39

Re: Firebird Datenbank - Verbindungsaufnahme
 
Welche Version hast du installiert? Eigentlich muß man ja nur eine dpk installieren, dann bekommt man 3 neue Reiter bzw. Bars (Mercury, Mercury Admin, Mercury Tools)

micha453 27. Mär 2006 10:40

Re: Firebird Datenbank - Verbindungsaufnahme
 
Muss mich verbessern, es sind nicht die ADO-Komponenten, sondern die Interbase-Komponenten. Diese sind in Delphi 6 Enterprise vorhanden. Hiermit kann ich auf Firebird zugreifen.

Micha

toyoman 27. Mär 2006 11:03

Re: Firebird Datenbank - Verbindungsaufnahme
 
Zitat:

Zitat von mkinzler
Welche Version hast du installiert? Eigentlich muß man ja nur eine dpk installieren, dann bekommt man 3 neue Reiter bzw. Bars (Mercury, Mercury Admin, Mercury Tools)


Hab dieses versucht zu installieren: RCLMDO70.dpk es erscheinen keine neuen Reiter obwohl die Installation erfolgreich abgeschlossen wurde. :roll:

toyoman 27. Mär 2006 11:09

Re: Firebird Datenbank - Verbindungsaufnahme
 
Zitat:

Zitat von micha453
Muss mich verbessern, es sind nicht die ADO-Komponenten, sondern die Interbase-Komponenten. Diese sind in Delphi 6 Enterprise vorhanden. Hiermit kann ich auf Firebird zugreifen.

Micha

wie bindest du die Datebank datei nun wirklich ein? ist ja eine FDB Datei oder?
Wenn ich mit der Interbase Datenbank Komponente IBDatabase1 versuche einen DatabaseName hinzuzufügen werden diese FDB Dateien nicht angezeigt, sprich ich kann sie nicht auswählen.

mikhal 27. Mär 2006 11:15

Re: Firebird Datenbank - Verbindungsaufnahme
 
Die rclmdo70.dpk erzeugen nur eine BPL für die Runtime-Einbindung, um auf die Komponenten im Design-Modus zugreifen zu können, mußt die dclmdo70.dpk installieren.

Grüße
Mikhal

toyoman 27. Mär 2006 13:34

Re: Firebird Datenbank - Verbindungsaufnahme
 
bin nun etwas weitergekommen. Verbindung klappt ohne Fehler.
Beim Filtern der Daten (SQLQuery gefiltert) kommt nun aber die tolle Meldung: "Ungültiges BLOB Handle im Datensatzpuffer."

mkinzler 27. Mär 2006 13:36

Re: Firebird Datenbank - Verbindungsaufnahme
 
Poste mal die datenbankbeschreibung und die Abfrage.

toyoman 27. Mär 2006 15:52

Re: Firebird Datenbank - Verbindungsaufnahme
 
Zitat:

Zitat von mkinzler
Poste mal die datenbankbeschreibung und die Abfrage.

Es handelt sich um eine Datenbank der Softwareverteilung. Ich brauche den Zugriff immer nur LESEND.

Hier die Filterung welche den Fehler hervorruft:

Delphi-Quellcode:
procedure TForm1.CheckBox1Click(Sender: TObject);
var
   strint:string;
   s: string;
begin
  query1.filtered:=false;
  if edit1.text<>'' then
  begin
     s:=chr(39);
     if checkbox1.checked=true then
     begin
       if checkbox2.checked=true then
       begin
          strint:=edit1.text;
          query1.filter:='oname = ' + s + strint +s;
          query1.filtered:=true;
       end else
       begin
          strint:=edit1.text;
          query1.filter:='oname like ' + s + strint +'%'+s;
          query1.filtered:=true;
       end;
     end else
     begin
          query1.filtered:=false;
     end;
  end;
end;
Der SQL String der SQLQuery siehst so aus:
SQL-Code:
SELECT COOBJECTS.ONAME, COPROPITEMS.PINAME, COOBJECTS.OINACTIVE, COPROPVALUES.PVNAME, COOBJECTS.OFULLNAME, COOBJECTS.OEMAIL, COOBJECTS.OCOSTCENTER, COOBJECTS.OTYPE AS Kurz
FROM ((COPROPDATA INNER JOIN COOBJECTS ON COPROPDATA.OID = COOBJECTS.OID) INNER JOIN COPROPITEMS ON COPROPDATA.PIID = COPROPITEMS.PIID) INNER JOIN COPROPVALUES ON COPROPDATA.PVID = COPROPVALUES.PVID
WHERE (((COPROPITEMS.PINAME)='Components.Last User') AND ((COOBJECTS.OINACTIVE)='0') AND ((COOBJECTS.OTYPE)='M')) OR (((COPROPITEMS.PINAME)='Components.System.Manufacturer') AND ((COOBJECTS.OINACTIVE)='0')) OR (((COPROPITEMS.PINAME)='Components.System.Computer Model') AND ((COOBJECTS.OINACTIVE)='0')) OR (((COPROPITEMS.PINAME)='Components.System.Motherboard.SerialNumber') AND ((COOBJECTS.OINACTIVE)='0')) OR (((COPROPITEMS.PINAME)='Components.System.Processor.MaxSpeed') AND ((COOBJECTS.OINACTIVE)='0')) OR (((COPROPITEMS.PINAME)='Components.Storage.Memory.Total') AND ((COOBJECTS.OINACTIVE)='0')) OR (((COPROPITEMS.PINAME)='Components.Harddisk.TotalSize') AND ((COOBJECTS.OINACTIVE)='0'))
ORDER BY COOBJECTS.ONAME;

mkinzler 27. Mär 2006 16:10

Re: Firebird Datenbank - Verbindungsaufnahme
 
Ist ja auch eine ganz einfache Abfrage. ;-)
Aber ohne die Berschreibung der Tabellen tue ich mich schwer:
Wieviele datensätze liefert die Grundabfrage? Grundsätzlich ist das clientseitige Filtern nicht optimal.Ich würde vorschlagen die Abfrage zu parametrisieren. Zerlege mal die Abfrage in Teilabfragen um zu sehen, wo der Fehler im Detail auftaucht.

toyoman 27. Mär 2006 16:37

Re: Firebird Datenbank - Verbindungsaufnahme
 
Zitat:

Zitat von mkinzler
Ist ja auch eine ganz einfache Abfrage. ;-)
Aber ohne die Berschreibung der Tabellen tue ich mich schwer:
Wieviele datensätze liefert die Grundabfrage? Grundsätzlich ist das clientseitige Filtern nicht optimal.Ich würde vorschlagen die Abfrage zu parametrisieren. Zerlege mal die Abfrage in Teilabfragen um zu sehen, wo der Fehler im Detail auftaucht.

ja sehr einfach ;)

Ok werdes mal versuchen mit einer vereinfachten Query.
Die Beschreibung der Tabellen zusammenzustellen ist schwierig. Sind so viele und ich habe da nur beschränkt Zugriff auf dieses Firebird Dingsbums. Ich hatte gehofft ich könnte das ganze normal wie eine SQL-Tabelle ansprechen. Bei mir auf dem PC ist ein ODBC Eintrag definiert welcher über den Firebird/Interbase Treiber auf den Server verbindet. Im Delphi mache ich dann eine Query über diese ODBC Verbindung.

mkinzler 27. Mär 2006 16:41

Re: Firebird Datenbank - Verbindungsaufnahme
 
Lad dir maldie Personalversion des IBExperts herunter. Dort kannst du einen Metadatenexport machen und auch Testweise Queries an die Datenbank schicken, um so zu evaluieren ob das Problem an der Verbindung (ODBC recht suboptimal), Delphi oder an der Datenbank/Abfrage liegt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz