Qt mit SQL Unterstützung (MySQL)

Verschiedenes zu Qt
Antworten
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Qt mit SQL Unterstützung (MySQL)

Beitrag 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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:00, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag 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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:02, insgesamt 3-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag 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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:00, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag 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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:00, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag 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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:01, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag 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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:01, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag 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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:01, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag 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
Antworten