Seite 1 von 1

Qt mit SQL Unterstützung (MySQL)

Verfasst: 27. Februar 2008 16:35
von KartoffelKiffer
Hallo,

ich versuche nun schon eine Zeit lang MySQL unter Qt zum Laufen zu bekommen.

Ich nutze die Commercial Version 4.3.3 unter Visual Studio 6.0 und MySQL 5.0.

MySQL habe ich komplett mit den Includes und Libraries installiert.

Um Qt zu konfigurieren nutze ich
configure -platform win32-msvc -qt-sql-mysql -plugin-sql-mysql
nmake

Das Konfigurieren klappt auch wunderbar, nur bei nmake schmiert er mir bei folgender Fehlermeldung ab:
---------------
.\../../../sql/drivers/mysql/qsql_mysql.h(32) : fatal error C1083: Cannot open i
nclude file: 'mysql.h': No such file or directory
NMAKE : fatal error U1077: 'cl' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Programme\Microsoft Visual Studio\VC98\bin\NMAKE
.EXE"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
----------------

Trotz zahlreicher Versuche bekomme ich es einfach nicht ans laufen, dass ich einfach einen #include <QSql> und darauffolgend QSqlDatabase machen kann.

Ich hoffe hier weiß jemand Rat zu meinem Problem.



Mfg KK

Verfasst: 27. Februar 2008 16:47
von Christian81
-L und -I - switches von configure.exe beachten.
Woher soll der Compiler sonst wissen wo er den Header zu suchen hat? Ach ja - in diesen Pfaden bitte keine Leerzeichen.

Verfasst: 28. Februar 2008 08:52
von KartoffelKiffer
Hallo Christian,

erstmal danke für Deine Antwort. Es scheint mit den Includes funktioniert zu haben.

Allerdings kommt nach etwa einer halben Stunde ein weiterer Fehler,
-------------------------
moc_controlinfo.cpp
Generating Code...
link /LIBPATH:"c:\Programme\Qt\4.3.3\lib" /LIBPATH:"c:\Programme\Qt\4.3.
3\lib" /NOLOGO /DEBUG /SUBSYSTEM:windows /OUT:debug\testcon.exe @C:\DOKUME~1\KK
\LOKALE~1\Temp\nmc03628.
midl C:\Programme\Qt\4.3.3/tools/activeqt/testcon/testcon.idl && move te
stcon.tlb
Microsoft (R) MIDL Compiler Version 5.01.0164
Copyright (c) Microsoft Corp 1991-1997. All rights reserved.
Processing C:\Programme\Qt\4.3.3\tools\activeqt\testcon\testcon.idl
midl : command line error MIDL1004 : cannot execute C preprocessor cl.exe
NMAKE : fatal error U1077: 'midl' : return code '0x3ec'
Stop.
NMAKE : fatal error U1077: '"C:\Programme\Microsoft Visual Studio\VC98\bin\NMAKE
.EXE"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
-------------------------
der mich nun völlig aus der Fassung bringt.

Ich habe heute morgen ein nmake confclean durchlaufen lassen. Danach habe ich mittels
configure -L C:\MySQL\lib\opt -I C:\MySQL\include -platform win32-msvc -qt-sql-mysql -plugin-sql-mysql
konfiguriert und anschließend ist er beim nmake mit der obigen Fehlermeldung abgeschmiert.

Was kann es denn damit nun noch aufsich haben?

// Edit: Noch ein kleiner Nachtrag. Und zwar kann ich nun mit der QtSql arbeiten, und bekomme auch beim Kompilieren des Programms keine Fehlermeldungen.
Mein Quellcode sieht wiefolgt aus:

Code: Alles auswählen

	QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
	db.setHostName("localhost");
	db.setDatabaseName("demo");
	db.setUserName("root");
	db.setPassword("root");
	bool ok = db.open();
	if (ok)
	{
		QMessageBox::information(0, "MySQL", "Connected");
	}
	else
	{
		QMessageBox::information(0, "MySQL", "Cannot connect: " + db.lastError().text());
	}
Nur springt er in die Else-Bedingung und spuckt den Fehler aus: "Driver not loaded". Nach einigem Suchen und Probieren habe ich es dennoch nicht ans Laufen bekommen. In meiner Entwicklungsumgebung habe ich die libs und includes von MySQL eingefügt und in die Main-Methode eine Zeile

Code: Alles auswählen

 QApplication app(argc, argv);	app.addLibraryPath("C:\\Programme\\Qt\\4.3.3\\plugins\\sqldrivers");
eingefügt. Natürlich ohne nennenswerte Ergebnisse. Dieselbe Fehlermeldung.
Im sqldrivers-Ordner wurden ettliche dll´s neu kompilliert, das zeigt mir das Datum. Sie sind also auf dem aktuellen Stand.

Nun habe ich es immernoch nicht am Laufen, und bitte immernoch um Hilfe.

// Edit2: Noch ein kleiner Nachtrag, meine .pro-Datei des Projekts sieht wiefolgt aus:

Code: Alles auswählen

DEPENDPATH += .
INCLUDEPATH += .
TARGET = proggi
QT = core gui sql
TEMPLATE = app
SOURCES += main.cpp
SOURCES += proggi.cpp
HEADERS += proggi.h
FORMS += proggi.ui
RESOURCES += proggi.qrc



Mfg KK

Verfasst: 28. Februar 2008 09:14
von Christian81
midl.exe ist in der kommerziellen VisualStudio-Version dabei. Allerdings wird das Verzeichnis für midl nicht in der open-source-Version von Qt kompiliert --> Du benutzt VSExpress + Qt Commercial soweit ich das sehe. Ist ein Fall für den Qt-Support, kann aber erstmal ignoriert werden.

Verfasst: 28. Februar 2008 09:17
von KartoffelKiffer
Hallo Christian,

ich habe in meinem Thread noch ein paar Informationen hinzugefügt.

Ich arbeite mit der Microsoft Visual C++ v6.0. Also keine Express-Version. Ein original lizensiertes Microsoft-Produkt.



Mfg KK

Verfasst: 28. Februar 2008 09:25
von Christian81
Dann schau ob dort midl.exe dabei ist (sollte eigentlich) und wenn nicht, kommentiere das Verzeichnis einfach in der pro-Datei aus.
btw: soweit ich weiss wurde für Qt4.4 endlioch msvc6 - support entfernt.

Verfasst: 28. Februar 2008 09:33
von KartoffelKiffer
Hallo Christian,

die midl.exe liegt im Verzeichnis C:\Programme\Microsoft Visual Studio\VC98\Bin\.
Sie ist also vorhanden.

Wie es scheint kann ich den Fehler auch ignorieren.

Ich komme bloß mit meiner Meldung "Driver not loaded" nicht klar. Es gibt zwar noch einige Threads dazu, nur lief keine der Möglichkeiten bei mir.

Wie gesagt wurden die dll´s korrekt übersetzt. Das Verzeichnis der sqldrivers habe ich meinem Programm auch mittels app.addLibraryPath("C:\\Programme\\Qt\\4.3.3\\plugins\\sqldrivers"); beigebracht.

Ein Kompilieren gelingt nun auch, nur kein Connect.




Mfg KK

Verfasst: 28. Februar 2008 09:39
von Christian81
das addLibraryPath ist komplett unnötig.

Die dll kann natürlich nur geladen werden wenn auch alle Dependencies davon vorhanden (also im PATH) sind. --> Dependency Walker

Verfasst: 28. Februar 2008 10:19
von KartoffelKiffer
Hallo,

ich habe mir das Programm einmal angeschaut und meine EXE (aus dem debug-Ordner) laufen lassen.
Es wird eine DWMAPI.dll nicht gefunden, bzw. kann nicht geöffnet werden.

Parrallel zur exe habe ich noch die drei dll´s QtSqld4.dll, QtCored4.dll und QtGuid4.dll kopiert, sie liegen also alle im selben Verzeichnis.

Die exe lässt sich auch problemlos starten, nur kommt halt wieder beim connect die Fehlermeldung.

In meine %PATH%-Variable habe ich nun das Verzeichnis sqldrivers hinzugefügt, dennoch ohne Erfolg.

Ich starte die Visual C++-Umgebung über die von Qt angelegte .bat-Datei mit folgendem Inhalt

Code: Alles auswählen

@echo off
rem
rem This file is generated
rem

echo Setting up a Qt environment...
echo -- QTDIR set to C:\programme\Qt\4.3.3
echo -- Added C:\programme\Qt\4.3.3\bin to PATH
echo -- QMAKESPEC set to win32-msvc

set QTDIR=C:\programme\Qt\4.3.3
set PATH=C:\programme\Qt\4.3.3\bin;%PATH%
set QMAKESPEC=win32-msvc

regedit /e S$D$K$ "HKEY_LOCAL_MACHINE\Software\Microsoft\MicrosoftSDK"
if not exist S$D$K$ goto ENDSDK\r
find "Install Dir" < S$D$K$ > D$I$R$
del S$D$K$
for /f "tokens=2 delims==" %%i in (D$I$R$) do call %%i\setenv
del D$I$R$
:ENDSDK\r

if not "%1"=="vsvars" goto END
call "C:\Programme\Microsoft Visual Studio\VC98\bin\vcvars32.bat"
:END

if not "%1"=="vsstart" goto ENDSTARTVS
call "C:\Programme\Microsoft Visual Studio\VC98\bin\vcvars32.bat"
msdev /useenv
:ENDSTARTVS
Vielleicht hat das noch etwas zu bedeuten? Welche Datei ist für das Qt-Programm denn der "Driver"? Also welche .dll benötigt er?

Die aus dem plugins-Verzeichnis? Oder die QtSqld4.dll aus dem bin-Verzeichnis?




Mfg KK

Verfasst: 28. Februar 2008 10:33
von Christian81
Viellicht habe ich mich nicht klar ausgedrückt.

Das Plugin, welches ja offensichtlich nicht geladen wird, hat dependencies (z.B. zur sql lib). Sind diese nicht auffindbar (im PATH), kann es nicht geladen werden. sqldrivers in den PATH aufzunehmen ist nicht nötig.

Verfasst: 28. Februar 2008 10:51
von KartoffelKiffer
Hallo,

da ich die Entwicklungsumgebung mittels .bat-Datei gestartet habe, hat mir diese das Setzen der PATH-Variablen (siehe Beitrag vorher) abgenommen.

Ich habe nun den bin-Pfad von Qt und MySQL in die PATH-Variable eingetragen. Ein Analysieren der Datei qsqlmysqld4.dll im sqldrivers-Ordner mittels Depends ergab auch, dass er die libMySQL.dll, die QtCored4.dll und die QtSqld4.dll nicht finden konnte.

Dies ist nun mit Setzen der Pfade in die PATH-Variable verschwunden.

Allerdings kann die qsqlmysqld4.dll zu einer DWMAPI.dll nicht auflösen (Error opening file. Das System kann die angegebene Datei nicht finden). Was offensichtlich stimmt, da ich sie auch auf meinem ganzen System nicht finden kann.

Wenn ich Dich jetzt richtig verstanden habe, löst die qsqlmysqld4.dll nur auf, wenn sie alle Beziehungen auch aufbauen kann. Dies ist wohl nicht der Fall, also kann das Plugin nicht geladen werden.

// Edit: Ich sehe gerade, dass die DWMAPI.dll in so gut wie jeder Qt-.dll fehlt. Auch in der /bin/QtCored4.dll



Mfg KK

Verfasst: 28. Februar 2008 11:00
von Christian81
Die dll kann fehlen - ist nicht weiter wichtig -> google

Wenn es jetzt immer noch nicht geht, einfach mal den Plugin-Cache von Qt löschen -> HKCU oder HKLM/Software/Trolltech/Qt Plugin Cache

Ggf. auch mal dort etwas rumstöbern was so drinsteht -> Foren-Suche, habe ich schonmal mit jemanden diskutiert

Verfasst: 28. Februar 2008 11:27
von KartoffelKiffer
Hallo,

db.open() gibt ein true zurück.

Ich danke Dir!!!!!!!

Löschen des Qt Plugin Caches hat es gebracht.

Ich habe jetzt einfach komplett Laufwerk C: aus dem Cache gelöscht. Und siehe da, mein Programm hat eine komplett neue Plugin Struktur aufgebaut. Nun auch mit den (frisch) installierten MySQL-Treibern.

Vorher hat QSqlDatabase::drivers() nur eine kleine Anzahl von Treibern angezeigt, welche (so schätze ich) bei der Installation von Qt aktiviert wurden. Da MySQL nicht standardmäßig aktiviert wird, muss Qt mit MySQL neu übersetzt werden und der veraltete Cache gelöscht werden.
Er wird dann bei Start eines Qt-Programmes wieder neu angelegt.

Vielen dank nochmal Christian.




Mfg KK

Verfasst: 28. Februar 2008 11:29
von Christian81
Manchmal - wie bei Dir - kann es sein dass der Plugin-Cache nicht neu aufgebaut wird. Sollte eigentlich passieren sobald sich das Erstellungsdatum eines Plugins ändert. Hatte aber noch keine Zeit/Lust zu schauen warum.

Verfasst: 28. Februar 2008 11:46
von KartoffelKiffer
Nehmen wir es einfach so hin.

Ich danke Dir auf alle Fälle. Werde in nächster Zeit auch keinen "Bremer" mehr essen.



Mfg KK