Seite 1 von 1
Qt 4.7 Sql mit VS2008
Verfasst: 9. Februar 2011 13:29
von f.o.g.
Hallo,
ja ich hab den anderen Thread gesehen, aber ich denke da passt es nicht hin.
Ich habe im Moment das Problem, dass ich gerne auf eine MySql Datenbank zugreifen will. Also hab ich erstmal etwas code geschrieben um auf die Datenbank zu verbinden. Es kam wie es kommen musste. "Driver not loaded"
Also hab ich etwas rumgegooglet. Es wurde vorgeschlagen, dass man die QT Libs und Dlls selbst kompilieren muss. Das habe ich dann auch folgendermaßen gemacht
1. Install MySQL with development files (%QTDIR% == C:\Qt\qt-win-opensource-src-4.5.3)
2. C:\Program Files\Microsoft Visual Studio 8\VC\bin\vsvars32.bat
3. cd %QTDIR%\src\plugins\sqldrivers\mysql
4. qmake "INCLUDEPATH+='C:\Program Files\MySQL\MySQL Server 5.1\include'" "LIBS+='C:\Program Files\MySQL\MySQL Server 5.1\lib\opt\libmysql.lib'" mysql.pro
5. nmake
6. Check result. (you will see files in %QTDIR%\plugins\sqldrivers)
(Pfade habe ich angepasst)
Wie genau geht's denn jetzt weiter?
Fast vergessen ich arbeite mit Qt 4.7 und der Qt Integration, nicht mit dem Add-In.
Verfasst: 9. Februar 2011 13:53
von brax
Hast Du denn das Plugin schon geladen?
Dabei könnte Dir das hier helfen:
http://toddcwilson.com/blog/2009/08/qt- ... e-by-side/
Nachdem Du das gemacht hast, sollte
Code: Alles auswählen
QString dbName = "yourDatabase";
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", dbName);
funktionieren.
EDIT: Achso, hatte noch vergessen zu fragen, ob denn nun unter $QTDIR/plugins/sqldrivers auch die qsqlmysql4(d).dll liegt.
Verfasst: 9. Februar 2011 14:01
von f.o.g.
danke für die schnelle antwort. ich lese das eben mal.
beide dll's sind vorhanden.
okay...
ich habs grad mal gelesen, aber ehrlich gesagt noch nicht verstanden
kannst du mir das etwas genauer erklären? wäre super nett.
danke.
Verfasst: 9. Februar 2011 16:36
von brax
Ok, also bevor Du den SQL Treiber benutzen kannst, musst Du das Plugin laden. Dafür brauchst Du folgenden Code (so wie ich ihn basierend auf dem code aus dem Link verwende). Das ganze geht davon aus, dass die dll mit dem plugin als side-by-side dll vorhanden ist - sie also in deinem app-verzeichnis liegt. Zusätzlich muss natürlich auch die libmysql.dll in dem Verzeichnis liegen, sonst schlägt das Pluginladen fehl:
Code: Alles auswählen
bool loadDriver() {
QString plugfilename = QString("%1/%2") .arg(QCoreApplication::applicationDirPath()). arg("qsqlmysql4.dll");
QLibrary *pLib = new QLibrary(plugfilename);
if (pLib != NULL)
{
bool fail = false;
if (!pLib->load()) {
fail = true;
} else {
void *pFN = pLib->resolve("qt_plugin_instance");
if (pFN != NULL) {
qRegisterStaticPluginInstanceFunction ((QtPluginInstanceFunction) pFN);
} else {
fail = true;
}
}
if (fail) {
QString err = pLib->errorString();
delete pLib;
qDebug() << "Could not load sql driver: " << err;
return false;
}
}
return true;
}
Im debug solltest Du den plugin dateinamen anpassen, also "qsqlmysqld4.dll".
Ich weiß nicht, ob das alles noch eleganter geht, so funzt es jedenfalls bei mir. Danach kannst Du dann über QSqlDatabase::addDatabase, wie vorhin geschrieben, die Datenbankverbindung herstellen. Viel Erfolg.
Verfasst: 9. Februar 2011 18:35
von Christian81
Ein Qt-Plugin (sql, icons, ...) muss nicht geladen werden - das macht Qt automatisch... und wenn das Plugin nicht geladen werden kann -> Dependency Walker und schauen welche Dependencies fehlen (ich schätze es fehlt die mysql-Library)
Verfasst: 9. Februar 2011 19:28
von brax
Das stimmt wohl, aber ich hatte dann immer Probleme beim Deployen der Anwendung auf anderen Rechnern, weshalb ich den beschriebenen Weg gewählt habe. Kann natürlich sein, dass ich mich einfach zu blöd angestellt habe.
Verfasst: 10. Februar 2011 09:31
von f.o.g.
hallo nochmals.
danke für die Erklärung. Leider komme ich nicht wirklich weiter
Ich erhalte von loadDriver folgenden Fehler:
"Cannot load library c:/development/src/Demo Projekte/database_frontend/Debug/qsqlmysqld4.dll: Das angegebene Modul wurde nicht gefunden."
Beim Dependency Walker konnte ich keine Abhängigkeiten zu qsqlmysql(d)4.dll entdecken. lediglich zu QtCore, QtGui, und QtSql.
Muss ich evtl. noch irgendwelche Projektparameter anpassen, damit die dll gelinkt wird?
Danke für eure Hilfe.
EDIT:
So nach ein wenig Probieren(die libmysql liegt jetzt im App Pfad), läuft jetzt zumindest loadDriver bis zum return true durch. allerdings kommt beim Versuch eine Verbindung aufzubauen immer noch der Fehler
Driver not loaded
Verfasst: 10. Februar 2011 09:57
von brax
Liegen denn sowohl die qsqlmysqld4.dll als auch die libmysql.dll in dem Verzeichnis?
Der Dependency Walker sagt in dem Fall tatsächlich nicht alles, weil das eigentliche mysql plugin (also die qsqlmysqld.dll) dynamisch nachgeladen wird (per dlopen auf linux bzw. LoadLibrary auf windows), so dass der Dependency Walker nichts mitbekommt (der weiß bloß, welche dll's durch das Linken mit der dazugehörigen .lib geladen werden). Relevant ist allerdings die Ausgabe vom Dependency Walker, wenn Du qsqlmysqld.dll damit öffnest (da siehst Du dann, dass libmysql.dll benötigt wird).
Ansonsten müsste es, wie Christian geschrieben hat, wohl auch ohne die loadDriver Funktion funktionieren, wenn Du die beiden dll's im Verzeichnis hast.
Verfasst: 10. Februar 2011 10:09
von f.o.g.
hab ich auch schon probiert, siehe mein edit von oben.
also ich hab mir jetzt nochmal mit
die verfügbaren Treiber anzeigen lassen:
("QSQLITE", "QMYSQL3", "QMYSQL", "QODBC3", "QODBC")
Sieht meiner meinung nach gut aus und trotzdem bekomme ich besagte Fehlermeldung.
Okay jetzt geht's. War mein Fehler. Ich hatte es mit
versucht. Korrekt ist aber
Also Danke für eure Hilfe.