Entwickler-Ecke

Datenbanken - Zugriff auf Firebird 2.0.3: womit?


mkmk - So 20.07.08 10:59
Titel: Zugriff auf Firebird 2.0.3: womit?
Servus allerseits

Ich arbeite seit nun 3 Wochen mit Delphi und bin nun beim Thema Database angelangt.
Bis anhin hatte ich mit "Visual FoxPro" via ODBC auf Firebird (2.0.3) zugegriffen.

Mit Delphi will ich nicht den Umweg über ODBC machen, sondern die native Komponenten benutzen.

Ich habe nun 1000 Fragen; aber die würde keiner lesen. Deshalb Schritt für Schritt.

In dieser Phase des Herumprobierens würde ich - wenn möglich - die Boardmittel von Delhphi 11 benutzen. Geht das? Auf Geschwindigkeit, Transaction und so kommt es mir z.Zt. nicht an.

Ich frage deshalb, weil ich beim Durchblaettern im Forum den Eindruck gewann, dass manche Komponenten Firebird 2 nicht unterstützen.
Und als ich dann nach dem Motto "auch ein blindes Huhn findet hin und wieder ein Korn" die TDatabase Komponente von BDE auf die Form zog und mit Rechtsklick die Werte eintragen wollte, kam es beim Aufklappen von 'Driver name' zu einer Fehlermeldung: er könne die Borland Database Engine nicht initialiseren.


mkinzler - So 20.07.08 11:41

Mit Bordmitteln: IBX, dbExpress, Ado
OpenSource-Fremdkomponenten: Zeos, UIB, FBLib, MDO, FreeIB, ...
Freeware: AnyDAC1
Kommerziell. IBDAC, FIBplus, IboObjects, AnyDAC2


hansa - So 20.07.08 11:57

Bordmittel sind nur bedingt zu empfehlen. Sofern es um volle Unterstützung von FB 2 geht, dann scheidet zumindest IBX schon aus. Für freie Komponenten (Zeos + Konsorten) gilt ähnliches.


mkmk - So 20.07.08 13:51

Zeos habe ich versucht. Aber dieser scheint FB 2.0 nicht zu unterstützen (wie auch Hansa bereits geschrieben hat).
Mit IBX habe ich ein paar Versuche gemacht; hatte bis anhin keine Probleme. Aber meine Tests beschraenkten sich bis anhin auf ein paar SELECT's.
IBObject scheint seit August 2007 keine weitere Release erfahren zu haben, was mir nicht ganz koscher ist.
IBDAC wird hingegen mit Releases geradezu erschlagen, was mir auch nicht ganz geheuer ist; der Preis mit USD 100 waere aber durchaus akzeptabel.
FibPlus: kosten so um die 300 USD. Für jemanden, der seine ersten Streifzüge durch Delphi macht, sicherlich nicht die Ideallösung :)

Kann ich mit IBX weitermachen? Oder werde ich damit sehr schnell auf die Nase fallen?
Mit geht es zur Zeit nur darum, den Zusammenhang der Komponenten zu verstehen.
Bei ODBC hat man nur 3 Funktionen: SQLCONNECT, SQLEXEC und SQLDISCONNECT.
Aber hier bei Delphi reiht sich eine Komponente hinter die andere.

Kann ich mit IBX weitermachen?


mkinzler - So 20.07.08 14:33

Zitat:
Kann ich mit IBX weitermachen?
Jein. Wenn du auf gewisse neue Features von FB verzichten kannst ( RETURNING, ...)
Ich selber verwende IBDAC und bin sehr zufrieden.


mkmk - So 20.07.08 14:44

Okay, versuchen geht in manchne Faellen über studieren. Vorallem wenn man nicht einmal weiss, worüber man sich den Kopf zerbrechen soll.
Zu allem hat Ibdac anscheinend auch noch eine 60 Tage dauernde Testzeit, was auch ganz nett ist.


mkinzler - So 20.07.08 14:45

Aber Achtung, wenn du dich erstmal an diese Komponenten gewöhnt hast, willst du nicht mehr umsteigen :lol:


mkmk - So 20.07.08 17:07

Kann mir jemand weiterhelfen. Ich habe jetzt mal IBDAC installiert und etwas herumgespielt. Aber ich schaffe es nicht, das Resultat der Query in einem TEdit anzuzeigen.
Was ich gemacht habe:
Die Komponenten TIBCConnection, TIBCTransaction und TIBSQL auf die Form gezogen.
Und dann folgenden Code geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
   IBCConnection1.Database := 'E:\\Data\\MyDocs\\Data\\Firebird\\PDB.FDB';
   IBCConnection1.Params.Clear();
   IBCConnection1.Params.Append('USER_NAME ''PSUSER''');
   IBCConnection1.Params.Append('PASSWORD ''P123''');
   IBCConnection1.LoginPrompt := false;
   IBCConnection1.Open;
   IF IBCConnection1.Connected <> TRUE Then begin
      ShowMessage('NICHT Verbunden');
      exit;
    end;

    IBCTransaction1.StartTransaction;
    IBCSQL1.SQL.Clear;
    IBCSQL1.SQL.Add('Select * from Personal ');
    IBCSQL1.Execute;

   { Bei IBX hat dies folgende funktioniert: }
//      Edit1.Text := FieldByName('Vorname').Value;

    IBCTransaction1.Commit;
    IBCConnection1.Close;


Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt


hansa - So 20.07.08 17:15

Und der nächste bitte. :mrgreen: Ich empfehle dazu IB/FB-spezialisierte native Komponenten. Sprich : FIBplus und fertig. Sind keine 200 EUR vorhanden, dann eben Zeos.


mkinzler - So 20.07.08 17:16

TIBCSQL dient zur Ausführung von Skripten. Verwende TIBCQuery, welches TIBDataSet entspricht
Ausserdem musst du .Open verwenden, das eine Datenmenge zurückgeliefert wird
@hansa, IBDac steht für InterBase Direct Access Components ...


hansa - So 20.07.08 18:25

Ist halt Geschmacksfrage. Wenn mehrere DBs unterstützt werden sollen, dann ist die Frage, welche zuerst hinten runterfällt. IMHO sind da spezialisierte besser.


mkmk - So 20.07.08 18:33

.... und was ist mit meiner eigentlichen Frage :) : wie zeige ich das Resultat an?


mkinzler - So 20.07.08 18:36

Genauso, Query.FieldByName('<Feldname'>.Value bzw. Query.FieldByName('<Feldname'>.as<Typ>
Zitat:
Ist halt Geschmacksfrage. Wenn mehrere DBs unterstützt werden sollen, dann ist die Frage, welche zuerst hinten runterfällt. IMHO sind da spezialisierte besser.

IBDAC sind spezielle Interbase Komponenten. Das der Hersteller auch andere Komponenten für MySQL, MSSQL, Oracle entwickelt und die Komponenten spezielle Fähigkeiten mit den anderen Komponenten teilen, andert an dieser Tatsache nichts!

[Edit: Tippfehler entfernt]


mkmk - So 20.07.08 18:42

Danke Markus!


mkmk - So 20.07.08 19:36

Geduld! Es nur noch 998 Fragen :)

Wenn ich die Where-Bedingung direkt definiere

Delphi-Quelltext
1:
2:
3:
IBCQuery1.SQL.Clear;
IBCSQL1.SQL.Add('Select * from Personal Where idnr = 1');
IBCQuery1.Open;

krieg ich das gewünchte Resultat.

Wenn ich aber eine integer Zahl mynr einsetzte, kommt als es zwar zu keinem Fehler, aber auch zu keinem Resultat


Delphi-Quelltext
1:
2:
3:
4:
mynr := 1;
IBCQuery1.SQL.Clear;
IBCSQL1.SQL.Add('Select * from Personal Where idnr = :mynr');
IBCQuery1.Open;


Wo mache ich was falsch.

Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt


mkinzler - So 20.07.08 19:44

Du musst den Parameter auch setzen:

Delphi-Quelltext
1:
IBCQuery1.ParamByName('mynr').Value := mynr;                    

Bei FoxPro wird automatisch eine gleichnamige Variable verwendet.


mkmk - So 20.07.08 20:08

Herzlichen Dank für die prompte Hilfe. Jetzt klappt's.
Das Ganze scheint auf den ersten Blick recht kompliziert zu sein. Zumindest komplizierter, als ich es mir vorgestellt hatte. Ein Projekt mit Schwergewicht Datenverarbeitung wird vermutlich zu einer regelrechten Schreib-Orgie ausarten.
Werde mal jetzt jede Zeile anhand des Manuals nochmals durchgehen.

Schönen Abend


mkinzler - So 20.07.08 20:16

Nicht unbedingt. Man kann auch vieles auf die Datenbank verlagern und sich vieles auch generieren lassen


mkmk - Mo 21.07.08 08:11

...
( mit aufgerissenen Augen und Panik in der Stimme ..... )

Heisst das, dass ich bei einer Datei mit x Feldern x-mal

Delphi-Quelltext
1:
2:
3:
Edit_1.Text := IBCQuery1.FieldByName('Field_1').asWasAuchImmer;
..
Edit_x.Text := IBCQuery1.FieldByName('Field_x').asWasAuchImmer;

schreiben muss?

Und beim Abspeichern:

Delphi-Quelltext
1:
2:
3:
IBCQuery1.ParamByName('Field_1').asWasAuchImmer := Edit_1.Text;
..
IBCQuery1.ParamByName('Field_x').asWasAuchImmer := Edit_x.Text;


?????

Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt


mkinzler - Mo 21.07.08 08:19

Nein du kannst auch datensensitive Controls z.B. DBEdits nehmen


mkmk - Mo 21.07.08 08:31

Danke. Mit anderen Worten: Wieder Manuals studieren.
Aber immerhin die Gewissheit, dass die obige Schreiborgie nicht notwendig ist.


mkmk - Mo 21.07.08 09:43

Hmmm, DBEtdits haben mir nicht so zugesagt.
Ich zeig' mal, wie ich es in Vfp gemacht habe.


Quelltext
1:
2:
3:
Achtung! kein Delphi-code!!
mynr = 23
SQLEXEC( nHandle, "Select * from Personal Where idnr = ?mynr", "qTmp")


Der gewünschte Datensatz befindet sich nun im temporaeren Cursor qTmp.
Und der Zugriff erfolgt ganz einfach mit:


Quelltext
1:
2:
3:
4:
Achtung! kein Delphi-code!!
Thisform.vorname.Value = qTmp.vorname
Thisform.nachname.Value = qTmp.nachname
usw. usf.


Gibt's sowas auch in Delphi?


UGrohne - Mo 21.07.08 09:44

@mkmk: Ein kleiner Hinweis: Wir haben für Delphi (und andere Sprachen) spezielle Highlighter. Die darfst Du auch statt der Code-Tags verwenden ;).


mkinzler - Mo 21.07.08 10:13

Mit DBEdits geht das grundsätzlich genauso. In FoxPro sind hat alle lassen dataaware in Delphi gibt es immer 2 Typen.
Du kannst dir natürlich auch persistente Felder erzeugen lassen (Doppelklick auf DataSet).

http://www.delphi-treff.de/tutorials/datenbanken/


Klabautermann - Di 22.07.08 18:14

Hi,

und ich hoffe gerade für so "Kleinkram" auch zu gebrauchen: http://www.delphi-library.de/topic_Mit+tTable+amp+tQuery+Arbeiten_363.html

Gruß
Klabautermann


mkmk - Mi 23.07.08 08:31

Danke, war ein sehr nützlicher Link.
Und auch ein herzliches Dankeschon an Markus, dessen Hinweise mir sehr geholfen haben.