Qt 4.7 Sql mit VS2008

Verschiedenes zu Qt
Antworten
f.o.g.
Beiträge: 25
Registriert: 25. September 2009 10:53

Qt 4.7 Sql mit VS2008

Beitrag 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" :cry:
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.
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag 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.
f.o.g.
Beiträge: 25
Registriert: 25. September 2009 10:53

Beitrag 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.
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag 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.
f.o.g.
Beiträge: 25
Registriert: 25. September 2009 10:53

Beitrag 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
Zuletzt geändert von f.o.g. am 10. Februar 2011 10:02, insgesamt 1-mal geändert.
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag 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.
f.o.g.
Beiträge: 25
Registriert: 25. September 2009 10:53

Beitrag von f.o.g. »

hab ich auch schon probiert, siehe mein edit von oben.

also ich hab mir jetzt nochmal mit

Code: Alles auswählen

qDebug() << QSqlDatabase::drivers(); 
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

Code: Alles auswählen

db.addDatabase("QMYSQL")
versucht. Korrekt ist aber

Code: Alles auswählen

db = QSqlDatabase::addDatabase("QMYSQL")
Also Danke für eure Hilfe.
Antworten