QODBC "Driver not loaded" Fehlermeldung

Alles rund um die Programmierung mit Qt
Antworten
ClassicSubzero
Beiträge: 21
Registriert: 26. September 2006 13:38

QODBC "Driver not loaded" Fehlermeldung

Beitrag von ClassicSubzero »

Meine Anwendung bearbeitet Access-Datenbanken.
(Selects, Inserts etc. -> Kein Problem)
Auf meinem Rechner läut alles einwandfrei, sobald ich aber die Anwendung auf einem anderen Rechner starte, kommt folgende Fehlermeldung hoch:

"Driver not loaded" bei jedem DB-Zugriff.

Habe als nächstes den Ordner SQLDRIVERS mit den Dateien: qsqlodbc4.dll,
qsqlodbc4.lib etc. dahin kopiert, wo sich die Executable befindet.

Hat aber nichts gebracht.
Hat jemand eine Lösung für dieses Problem?

MFG Sub
Zuletzt geändert von ClassicSubzero am 3. Dezember 2007 14:24, insgesamt 2-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Forum-Suche?
Das tritt jede Woche mindestens einmal auf, und jede Woche wird auf die Foren-Suche verwiesen. Ist sie wirklich so schwer zu benutzen????

z.B.
http://qtforum.de/forum/viewtopic.php?t ... ver+loaded

Ausserdem steht alles in der Doku
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ClassicSubzero
Beiträge: 21
Registriert: 26. September 2006 13:38

Beitrag von ClassicSubzero »

Danke Christian81!

Und sorry.. , bei meiner Suche war gerade dieses Thema nicht dabei, wahrscheinlich fehlte ein Schlüsselwort oder so..

Nächstes mal klappt es bestimmt!

MFG Sub
ClassicSubzero
Beiträge: 21
Registriert: 26. September 2006 13:38

Beitrag von ClassicSubzero »

ich habe mich wahrscheinlich zu früh gefreut, so einfach mit dem QODBC Plugin ist es doch nicht...
Ich habe den "qsqldrivers"- Ordner mit den erforderlichen DLLs für Access DBs in das Verzeichnis kopiert, wo sich
die Executable meines Programms befindet. Die Fehlermeldung kommt trotzdem.
Als nächstes den Library-Pfad gesetzt, mal so:

Code: Alles auswählen

int main(int argc, char *argv[])
{
    MyQApplication a(argc, argv);
      a.addLibraryPath(a.applicationDirPath ());
    DB_Converter w;
    w.show();
    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    return a.exec();
}

mal so:

Code: Alles auswählen

int main(int argc, char *argv[])
{
    MyQApplication a(argc, argv);
   QString test = a.applicationDirPath();
   QString path = test+"/sqldrivers";
   a.addLibraryPath(path);
    DB_Converter w;
    w.show();
    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    return a.exec();
}
Auf dem Testrechner kommt die Fehlermeldung : "Driver not loaded"

Hat jemand vielleicht noch eine Idee, woran es liegen kann? Sind es Einstellungen in VS 2005?
Habe schon diverse Foren durchforstet..
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das Plugin muss im gleichen Mode (Release/Debug) wie deine Applikation compiliert worden sein. Auch die Qt-Version muss passen.
Mit dem Tool 'Filemon' kann man sehen welche Dateien die Applikation zu laden versucht. Ggf. fehlt doch noch eine ODBC-.Dll.
Ggf. auch mal mit Dependency Walker nachschauen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ClassicSubzero
Beiträge: 21
Registriert: 26. September 2006 13:38

Beitrag von ClassicSubzero »

Die Plugins habe ich aus dem Verzeichnis E:\QT\4.3.2\plugins\sqldrivers\
für das Testen komplett übernommen, das sind:

qsqlite4.dll
qsqlite4.lib
qsqlited4.dll
qsqlited4.lib
qsqlmysql4.dll
qsqlmysql4.lib
qsqlmysqld4.dll
qsqlmysqld4.lib
qsqlodbc4.dll
qsqlodbc4.lib
qsqlodbcd4.dll
qsqlodbc4d.lib
qsqlpsql4.dll
qsqlpsql4.lib
qsqlpsqld4.dll
qsqlpsqld4.lib

Filemon (heute heisst er Procmon.exe) zeigt mir an, dass auf meine EXE zugegriffen wird (Durch Process and Thread Activity - Filter gejagt).
Kiene fehlenden DLLs...

Mit dem DependenceWalker die EXE Debugged :> Keine fehlenden DLLs,
der einzige Hinweis in der Ausgabe:

LoadLibraryA("browseui.dll") returned 0x75F20000.
...

QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers:

Obwohl alles auf meinem Rechner läuft und sich fehlerfrei kompilieren lässt.

Fehlt noch irgendwas? Muss noch irgendeine Einstellung in dem Projekt berücksichtigt werden?

Ich stehe vooll auf dem Schlauch..
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Für odbc brauchst du nur qsqlodbc4.dll und nicht noch irgend eine externe Lib? Oder zumindest irgend einen ODBC-Triber oder so? Sagt DepWalker bei qsqlodbc4.dll wirklich nichts?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ClassicSubzero
Beiträge: 21
Registriert: 26. September 2006 13:38

Beitrag von ClassicSubzero »

Die ODBC Treiber sind ab Service pack 1 automatisch installiert, habe ich auch über ODBC-Datenquellen geprüft.
DependenceWalker sagt nur was, wenn eine DLL fehlt, und an der Stelle, wo das Programm die Datenbank öffnet, wird im Textfenster der besagte Text

QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers:

ausgegeben. Ob man noch eine externe LIB braucht werde ich noch forschen müssen :/
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Eine gute Anlaufstelle ist ggf. noch HKCU\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache - dort schreibt Qt rein was für Plugins es gefunden hat und wie der Build-Key & Status ist. Vielleicht hilft das etwas weiter.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ClassicSubzero
Beiträge: 21
Registriert: 26. September 2006 13:38

Beitrag von ClassicSubzero »

Den besagten Eintrag in der Registry für Testzwecke gelöscht (wird immer neu angelegt, bei jedem Start des Programms), dann lief das Programm, dann wieder nicht, wenn z.B Windows neu gestartet wurde, oder das Programm von einem anderen Speicherstick gestartet wurde, oder wenn man vcredist_x86 installiert. Ein recht komisches Verhalten.
Ich habe auch versucht, die Release-Version des SQL-Browsers (ist bei den Qt Demos zu finden) auch unter denselben Bedingungen zu starten -> dasselbe Theater: Mal hat er die ODBC Treiber, mal nicht
Possible Manifest<->DLL malfunction.
Als nächstes möchte ich meine 4.3.2 Qt-Version neu kompilieren und hoffe, dass alles wieder im Lot ist.

Danke für den Tip mit dem Registry-Eintrag.

MFG Sub
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich hatte auch Probleme wenn ich ein Plugin mit VS2005 und eins mit VS2005SP1 kompiliert habe, auch wegen den doofen manifests.
Ggf. Qt auch mal mit -MT(d) anstatt -MD(d) (mkspecs/win32-msvc2005/qmake.conf anpassen -> embed_manifest_exe und _dll rausnehmen!) kompilieren damit man die Abhängikeit zur msvc runtime nicht mehr hat.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ClassicSubzero
Beiträge: 21
Registriert: 26. September 2006 13:38

Beitrag von ClassicSubzero »

OK, Qt 4.3.2 neu kompiliert, alle benötigten DLLs in den Programmordner kopiert. Es gab trotzdem dieselbe Fehlermeldung. Die Lösung war dann diese hier:

In den Plugin-Ordner "sqldrivers" müssen die Visual Studio DLLs und die Manifest-Datei kopiert werden. ( ja ja, nicht nur wo die EXE ist, auch in den Plugin-Ordner !!! )

Das Progy funktioniert jetzt.

Ich hoffe das dieses Thema hier einigen das Leben erleichtert und einige Stunden Arbeit spart.

Thx@ Christian81 für Support und Ideen

MFG Sub
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das ist komisch da normalerweise die .manfiest - Dateien in die dll/exe eingefügt werden (dafür ist mt.exe da), kann man in den pro-Files mit embed_manifest_dll und embed_manifest_exe festlegen. Sollte aber beides standardmässig aktiviert sein.

/edit: Ausserdem müsste Dir das auch DependencyWalker sagen wenn Du es auf dem Zielsystem aufrufst.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten