Entwickler-Ecke

Datenbanken - Login nicht möglich / Fehlende Treiber


HenryHux - Mo 26.12.11 12:15
Titel: Login nicht möglich / Fehlende Treiber
Hi,

ich wollte mal unter Xe2 die dbExpress Komponenten mit MySql ausprobieren.
Nachdem ich einige Fehler zu fehlenden Treiber bekommen habe, habe ich mir den MySql Installer for Windows geladen.
Trotzdem kann ich keine Verbindung aufbauen:

Quelltext
1:
DBX-Fehler:  Der Treiber konnte nicht korrekt initialisiert werden.  Die Client-Bibliothek könnte fehlen, nicht ordnungsgemäß installiert sein, eine falsche Version haben, oder der Treiber fehlt möglicherweise im Systempfad..                    


Vorhanden ist nur eine TSQLConnection mit Driver=MySQL.
Ob ich einen Login Versuch starte oder nicht, ich bekomme diesen Fehler.

Fehlen mir Treiber, oder was muss ich noch beachten?

lg


Nersgatt - Mo 26.12.11 12:23

Bei Firebird + DbExpress muss man in der Connection den Pfad zur Clientlibrary angeben. Ich denke mir, dass das bei MySQL auch so sein wird:

Delphi-Quelltext
1:
2:
Connection.LibraryName := 'dbxfb4d15.dll';
Connection.VendorLib := 'fbclient.dll';


HenryHux - Mo 26.12.11 12:53

Hm, das scheint nicht das Problem zu sein, die Pfade waren ja angegeben.
Allerdings klappt hier überhaupt keine Verbindungsart im Daten-Explorer mit dbExpress.
Habe alle Updates installiert und soweit ich weiß ist doch zb Firebird in jeder Xe2 Version enthalten, oder?
Das ist der Fehler den ich bei Verbindung testen kriege:

Quelltext
1:
Borland.Data.TDBXError: DBX-Fehler:  Der Treiber konnte nicht korrekt initialisiert werden.  Die Client-Bibliothek könnte fehlen, nicht ordnungsgemäß installiert sein, eine falsche Version haben, oder der Treiber fehlt möglicherweise im Systempfad.                    


Hat jemand ne Idee?

lg


jaenicke - Mo 26.12.11 20:42

Bei der Professional hast du MySQL und Interbase zur Verfügung. Bei MySQL erinnere ich mich, dass nur eine bestimmte Version funktioniert. Die aktuelle nicht. Siehe Dokumentation, dort steht die Version 5.1 drin. Die 5.1.54 ging zum Beispiel. Die aktuelle Version 5.5 aber nicht.


HenryHux - Mo 26.12.11 21:15

Okay, danke für den Tipp, bin weiter gekommen.
Bin sogar soweit, dass er den Verbindungstest erfolgreich besteht, ich weiß nur nicht ganz, was ich da gemacht habe :D
Und zwar habe ich erstmal MySQL 5.1.54 geladen. Damit war der Fehler erstmal weg.
Den Standard-Servernamen "ServerName" wollte er nicht akzeptieren, da habe ich es mit localhost probiert, nimmt er.
Dann akzeptiert er ebenfalls nicht den Datanbanknamen "DBNAME" und auch keinen anderen(die ich getestet habe). Außer "MYSQL".
Dann noch die konfigurierten Login Daten eingetragen, dass es so aussieht:
Verbindungstest (jpg, 50 KB)
Wie gesagt, dann klappt es.
Wieso habe ich noch nicht verstanden, ich werde mal weitermachen und sehen was sich noch tun lässt.

Vielen Dank :)

lg


jaenicke - Mo 26.12.11 21:25

Wie sieht denn deine Datenbankkonfiguration aus? Also deine Datenbanken und Tabellen?


HenryHux - Mo 26.12.11 22:25

Hmm weiß nicht genau was du meinst..
Ich habe eine komplett neue Verbindung hinzugefügt, erstmal ohne Tabellen oder Sonstiges anzulegen.
Allerdings befinden sich schon einige Tabellen in der Konfiguration, die ich nicht erstellt habe.
Ich denke mal, die werden dann von anderen Anwendungen erstellt worden sein.

lg


jaenicke - Mo 26.12.11 22:31

Ich meine:
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Dann akzeptiert er ebenfalls nicht den Datanbanknamen "DBNAME" und auch keinen anderen(die ich getestet habe).
Bist du denn sicher, dass die Datenbanken so existieren wie du sie versucht hast einzutragen? Ich meine so etwas wie einen verwechselten Tabellen- und Datenbanknamen oder so. ;-)


HenryHux - Mo 26.12.11 22:49

Ah ok hatte mich vertippt. Mit Delphi habe ich mir die Datenbanken ausgeben lassen, gibt 3 vorhandene, mit denen ich dann auch Verbindungen anlegen kann.
Klappt jetzt also alles, sogar recht einfach, wenn man von Anfang an gewusst hätte, wie :D

Danke,

lg

//Edit

Eine Frage hätte ich noch:
Ist es sicher die dbExpress Komponenten dynamisch bei Bedarf zu erzeugen und freizugeben, oder sollte ich die statisch auf dem Hauptformular verweilen lassen?


jaenicke - Mo 26.12.11 22:56

Du kannst eine Tabelle auch einfach aus dem Datenbankexplorer auf dein Formular oder Datenmodul ziehen, falls du das noch nicht gemerkt hast. Dann werden die entsprechenden Komponenten automatisch angelegt und initialisiert. ;-)

Ich würde dir zu einem Datenmodul raten um die Verbindungen auszulagern. Das wiederum kannst du dann dynamisch erzeugen.


HenryHux - Mo 26.12.11 23:05

Okay, danke, damit werde ich mal ein bisschen rumexperimentieren.
Was mir noch aufgefallen ist, ist, dass unter 64bit nichts mehr funktioniert.
Gibt es da Lösungen für?

lg


jaenicke - Di 27.12.11 00:06

Für 64-Bit musst du auch die 64-Bit Version von MySQL installiert haben schätze ich. So ist es jedenfalls bei Firebird und das ist ja eigentlich auch logisch.


HenryHux - Di 27.12.11 16:48

So, habe jetzt zum ersten Mal versucht ein Eintrag zu speichern.
Dabei bin ich auch wieder auf Probleme gestoßen, und zwar folgende :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TDatabase.Add(Dir: string);
begin
  //Methode 1
  with DataModule1.MySQLTable do begin
    //Doppelten Pfad Eintrag prüfen
    Filtered := false;
    Filter := 'Path='+Dir;
    Filtered := true;
    if FieldByName('Path').AsString = Dir then exit;
    Filtered := false;

    //Neuen Datensatz erstellen
    Append;
    FieldByName('Path').AsString := Dir;
    Post;
    //Im Projekt ist eine Exception der Klasse EDatabaseError mit der Meldung
    //'MySQLTable: Diese Operation ist bei einer unidirektionalen
    //Datenmenge nicht gestattet' aufgetreten.
  end;

  //Methode 2
  with DataModule1.MySQLQuery do begin
    SQL.Text := 'INSERT INTO moviedatabase(ID,PATH) VALUES(:ID,:Dir);';
    ParamByName('ID').Value := 0;
    ParamByName('Dir').Value := 'Dir';
    ExecSQL;
      //Im Projekt ist eine Exception der Klasse TDBXError mit der Meldung
      //'Der dbExpress-Treiber unterstützt den Datentyp TDBXTypes.UINT8 nicht.
      //Fehlermeldung des Herstellers:  .' aufgetreten.
  end;
end;


Wenn ich da große Umwege gehen muss um Einträge zu schreiben, dann ist die Methode auch nicht wirklich das richtige für mich..
Geht das nicht einfacher?


lg


jaenicke - Di 27.12.11 18:10

Bei dbExpress kannst du nur in eine Richtung durch die Datensätze gehen. Daher brauchst du noch ein TClientDataSet, das die Daten und deren Änderungen zwischenspeichert. Mit ApplyUpdates schreibst du die dann zurück in die Datenbank.


HenryHux - Di 27.12.11 21:02

Okay, habe ich mal versucht.
Hier mein Konzept bis jetzt, klappt das so?

Quelltext
1:
TSqlConnection -> TSqlDataSet -> TDataSetProvider -> TClientDataSet -> TDataSource                    

Die sind praktisch so in Reihe geschaltet.
Wie mache ich das jetzt richtig, wenn ich etwas schreiben will?
Ich müsste, vorausgesetzt das klappt so, in dem DataSource eine Kopie der MySql Tabelle haben.
Jedoch kann ich dadrin ja nicht mit Sql-commands arbeiten, oder doch?

Ehrlich gesagt bin ich da ein bisschen verwirrt im Moment, was da wovon abhängt..

Edit: Ich habe es geschafft, dass ich mit einem TDBNavigator die DataSource verändern kann, welchen Weg kann ich ohne den Navigator gehen?

lg


HenryHux - Mi 28.12.11 16:42

Hi,

ich habe mal ein Beispiel mit MySql im Anhang, so wie das bei mir im Moment aussieht.
Es klappt alles, aber ich weiß nicht, wie ich Sql Befehle übermittle.
Vielleicht kann sich jemand, bei dem dbexpress funktioniert, das kurz angucken.
Danke :)


Nersgatt - Mi 28.12.11 19:25

Du musst nur eine TSQLQuery mit der TDatabase verbinden. Der Sqlbefehl kommt ins .CommandText
.Open, wenn er Datensätze zurückliefert.
.Exec, wenn er keine Datensätze zurückliefert.

Um es dann z.B. an ein Grid zu binden, verwende ich immer
TSQLQuery -> TDataSetProvider -> TClientDataset -> TDataSource -> Grid