Qt und SQL ODBC

Alles rund um die Programmierung mit Qt
Antworten
*42*
Beiträge: 2
Registriert: 10. November 2010 02:21

Qt und SQL ODBC

Beitrag von *42* »

Hoffentlich kann mir jemand auf die Sprünge helfen, denn ich dreh' langsam durch :-) ... Habe seit Tagen diverse Suchfunktionen benutzt, dicke Bücher gewälzt ... man kann halt viel Zeit mit Sachen verlieren, von denen man wenig versteht ...

Also ich hab' zwei WinXP PCs im Netzwerk. Auf einem läuft MS SQL Server mit einer Datenbank ... Ich hab' ein MSVC++-Programm welches darauf lokal erfolgreich zugreift (ohne Qt). Das funktioniert auch über's Netz von dem anderen PC. Nun muß das gleiche Programm unter Linux laufen und ich will's mit Qt machen. Also läuft auf dem zweiten PC das aktuelle Ubuntu als virtuelle Maschine. Ich kann damit auch auf den ersten PC zugreifen. Alle WinXP-Firewalls sind aus.

Habe also unter Ubuntu das aktuelle Qt installiert, Beispiele getestet, alles OK. Aber egal was ich mache, ich komm' nicht an die Datenbank ran. Zuerst kam die Meldung von addDatabase("QODBC"), daß die Qt-Installation für diesen Typ Datenbank keinen Treiber hat, sondern nur andere wie SQLITE etc. ... obwohl in diversen Dokus immer behauptet wird, ODBC und MySQL wären unterstützt ... Ich wollte eigentlich partout nichts mit configure, make und install zu tun haben, hab' es dann doch gemacht ... nun akzeptiert Qt das ODBC, hat aber all die anderen DB-Typen verloren (und die Beispielprojekte sind angeblich auch nicht mehr installiert ... fluch, ich hab' keine Ahnung).

Die nächste Klippe war dann, was in setDatabaseName() usw. rein muß. Ich bekam immer nur die Fehlermeldung, daß kein Defaulttreiber gesetzt ist etc. Seltsamerweise von iODBC, dachte ich Qt arbeitet mit unixODBC ... Also hab' ich nun die odbc.ini bearbeitet, ohne großen Erfolg. Die Variable ODBCINI hab' ich gesetzt und die odbc.ini wird auch gefunden, aber was auch immer ich im Web lese und versuche, ich bekomme immer die o.g. Meldung. Also habe ich in setDatabaseName() nun vollen Pfad und Name einer *.DSN Datei gesetzt und in der Datei unter Driver=... den vollen Pfad zum einzigen odbc-Treiber angegeben, den ich im ganzen System gefunden habe :

/usr/lib/qt4/plugins/sqldrivers/libqsqlodbc.so

Jetzt startet die Applikation ohne Fehlermeldung ... und kommt nicht mehr zurück, also zumindest nicht nach 5 Minuten oder so ... Die ganze Applikation besteht nur aus 20 Zeilen Code ... QApplication, QSqlDatabase,addDatabase,setDatabaseName, if db.open, return app.exec();

Solange es Fehler gab, kam die Messagebox, nun nicht mehr ... Ich vermute, daß mit der *.so Datei was nicht stimmt, aber weiß man's ?

Vielen Dank, falls jemand bis hier gelesen hat !

Any comments ? Ich frag' mich gerade, ob ich alles von vorn anfangen soll ... wäre wirklich sehr dankbar für Hilfe ...
koppi
Beiträge: 29
Registriert: 21. Dezember 2010 14:30
Wohnort: Augsburg
Kontaktdaten:

Re: Qt und SQL ODBC

Beitrag von koppi »

Unter Linux gibt es ein Paket "apt-file". Das mal mittels "sudo apt-get install apt-file; sudo apt-get update" installieren.

Dann kannst Du suchen: z.B. "$ apt-file search odbc | grep qt4" und siehe da, es gibt ein ODBC-Paket für Qt unter Linxu:

Code: Alles auswählen

libqt4-dbg: /usr/lib/debug/usr/lib/qt4/plugins/sqldrivers/libqsqlodbc.so
libqt4-dev: /usr/include/qt4/Qt/qsql_odbc.h
libqt4-dev: /usr/include/qt4/QtSql/qsql_odbc.h
libqt4-sql-odbc: /usr/lib/qt4/plugins/sqldrivers/libqsqlodbc.so
libqt4-sql-odbc: /usr/share/doc/libqt4-sql-odbc/LGPL_EXCEPTION.txt
libqt4-sql-odbc: /usr/share/doc/libqt4-sql-odbc/changelog.Debian.gz
libqt4-sql-odbc: /usr/share/doc/libqt4-sql-odbc/changelog.gz
libqt4-sql-odbc: /usr/share/doc/libqt4-sql-odbc/copyright
Dann: "$ sudo apt-get install libqt4-sql-odbc"..

An Deiner Stelle würde ich nicht das selber kompilierte Qt unter Linux verwenden. Gibt nur Probleme. Ansonsten: lass mal Code sprechen. Vielleich verbirgt sich ja irgendwo ein kleiner Bug.
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

Du musst einen ODBC-Treiber installieren. unixODBC ist nur der Treiber-Verwalter. Leider gibt es nur einen OS-Treiber, der meines Wissens auch nicht mehr sehr aktiv weiter entwickelt wird, nämlich FreeTDS. Hab versucht, damit auf MS SQL zuzugreifen, hat leider nicht richtig geklappt.
Keine Ahnung obs an der Konfiguration oder an Qt lag.
Von Easysoft gibts noch einen proprietären Treiber, welcher zumindest zum testen gratis ist, danach kostet der eine schöne Stange Geld.
*42*
Beiträge: 2
Registriert: 10. November 2010 02:21

Danke !

Beitrag von *42* »

Danke für's antworten. Hatte ich gar nicht mehr mit gerechnet. Den größten Teil des Problems hab' ich mit einer Menge Verzweifelaufwand gelöst bekommen. Hab' die komplette virtuelle Maschine neu gemacht, neues Linux, neues Qt4 etc. Bin dann auch darauf gekommen, daß das was Qt als ODBC Treiber bezeichnet in Wirklichkeit die 3te Schicht ist. Hab dann den für Qt richtigen Treibermanager (glaub' unixODBC) installiert und mich nach dem eigentlichen ODBC-Treiber umgesehen und bin auch zu dem einzigen kostenlosen FreeTDS gekommen. Nachdem der dann installiert war, hab' ich das Konfigurationsfile editiert, nur hatte ich diesmal mehr Glück mit der Beschreibung - im Internet gibt es mehrere und die sagen nicht immer das Gleiche. Dann konnte ich von der Shell auf die Datenbank zugreifen, was schon mal ein gutes Zeichen war. Nun mußte ich "nur noch" Qt beibiegen, daß es auch ODBC kann, was komischerweise nach der Standartinstallation nicht automatisch geht. Das Problem war dann, daß Qt den Source-Code von diversen unteren Schichten braucht. Dazu mußte ich Teile meines Linux downgraden, also z.B. irgendeinen Treiber, der direkt gar nichts mit dem ODBC zu tun hat von Version 2.3.4 auf 2.3.3 bringen, weil für die von Linux automatisch installierte Version halt kein Source verfügbar war (aus Sicht des Paketmanagers). Mußte für so ca. 5 Sachen solche Bocksprünge machen, aber dann hatte ich endlich alles so wie's sein sollte. Hab' mir dann noch den sog. Qt ODBC Treiber runtergeladen und in das entsprechende Qt Verzeichnis kopiert und damit klappte es dann.

Ganz ehrlich - ein echter Krampf. OK, wenn sowas mal wieder vorkommt, bin ich jetzt besser vorbereitet, aber intuitiv ist anders und im ganzen Web konnte ich keine Anleitung finden. Und das Qt von ODBC Treiber spricht ist nun echt verwirrend. Die Fehlermeldungen sind größtenteils nicht hilfreich, wenn man den ganzen Mechanismus nicht schon verstanden hat.

Was als Problem bleibt, ist die Sache mit dem UniCode. Der MS SQL Server arbeitet ja intern nur damit, aber der alternativlose Treiber FreeTDS kann UniCode nicht duchreichen, sondern er übersetzt hin und her. Man kann angeben, wohin er übersetzen soll, aber es funktioniert nicht. Im Moment helfe ich mir, indem ich die bulgarischen Strings nicht als Strings sondern als Binary aus der Datenbank hole, wobei ich natürlich die Stringlänge verliere. Diese hole ich mir extra und dann schneide ich mir aus den Binärdaten die Strings raus und da Qt mit UniCode keine Probleme hat, bekomme ich die richtigen Texte in die Dialoge de Oberfläche. Aber schön ist das nicht. Habe schon diverse naheliegende Formate (Codetables) ausprobiert, aber bisher kam nur Kauderwelsch raus. Aber im Vergleich zum ursprünglichen Problem ist das ein Klacks ...

Hätte nie erwartet, daß schon der einfache Zugriff auf eine Datenbank zu einem solchen Krampf ausarten würde. Jetzt bin ich weiter und schlage mich damit rum, daß die Formatierung von Widgets komischweise mal so, mal anders und z.T. gar nicht funktioniert. Was ich da schon an Zeit verloren habe ... Naja, wenigstens lernt man was :-) ...

Danke nochmal für die Hilfe !!!
Antworten