PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt und SQL



michal
05-02-2003, 18:07
Hallo!

Ich experimentiere schon eine Weile mit der Programmierung unter Qt/KDE.
(Mein System: Suse 8.1 / KDE 3.1 / Qt 3.1.1)

Nun wollte ich eine kleine Datenbankanwendung mit Hilfe der Klasse QSql herstellen. Das compilieren klappt einwandfrei. Jedoch behauptet dann das Programm nach dem Start (bzw. QSqlDatabase) folgendes:

QSqlDatabase warning: QMYSQL3 driver not loaded
QSqlDatabase: available drivers: QMYSQL3 QPSQL7 QODBC3

Und das, obwohl ich den korrekten Treiber (QMYSQL3) angegeben habe!
Mit dem Qt-Designer klappt alles wunderbar. Die Tabellen werden Preview korrekt angezeigt und können bearbeitet werden.

Hat jemand Erfahrungen und kann eine Lösung zu diesem Problem angeben?

Gruß Micha :)

michal
07-02-2003, 09:59
:) Habe weitere Experimente mit QSql durchgeführt:

- Mit Hilfe von KDevelop ein neues Qt-Projekt gestartet
- Die gleiche Datenbank wie im obigen Problem angesprochen
- Übersetzt und
- erfolgreich verbunden und gestartet :D

Warum es aber "zu Fuß" (Kate und Konsole) nicht funktioniert, ist immer noch ein Problem...

Gruß Micha

TheDodger
07-02-2003, 10:27
Ohne ein wenig code ... kann ich dir auch nicht helfen, sonder nur mutmaßen.
:)
Also meine Projekte mit QT & SQL laufen super ... und ich arbiete nur 'zu Fuß'.

michal
07-02-2003, 12:51
Ich hab' das Beispiel aus der Qt-Online-Doku:



#include <qapplication.h>
#include <qsqldatabase.h>

#define DB_ADRESS_DRIVER "QMYSQL3"
#define DB_ADRESS_DBNAME "test"
#define DB_ADRESS_USER "user"
#define DB_ADRESS_PASSWD "passwort"
#define DB_ADRESS_HOST "localhost"


int main( int argc, char *argv[] )
{
QApplication app( argc, argv, FALSE );

QSqlDatabase *defaultDB = QSqlDatabase::addDatabase( DB_ADRESS_DRIVER );
if ( ! defaultDB )
{
qWarning( "main: Keine Verbindung zur Datenbank" );
return 1;
}
defaultDB->setDatabaseName( DB_ADRESS_DBNAME );
defaultDB->setUserName( DB_ADRESS_USER );
defaultDB->setPassword( DB_ADRESS_PASSWD );
defaultDB->setHostName( DB_ADRESS_HOST );

if ( defaultDB->open() ) {
// Datenbank geöffnet:
qWarning("Datenbank erfolgreich geöffnet...");
}

return 0;
}


Kannst Du irgendwo einen Fehler sehen?:confused:

Wie gesagt: mit Hilfe von KDevelop geht's (auch als KDE-Programm).
Hier auch noch meine Pro-Datei:

TEMPLATE = app
CONFIG += qt warn_on release
SOURCES = main.cpp
HEADERS =
TARGET = connect

Vielen Dank
Micha

TheDodger
08-02-2003, 16:52
meine main() sähe so aus:


int main( int argc, char *argv[] )
{
QApplication app( argc, argv, FALSE );

QStringList drivers = QSqlDatabase::drivers();

if( drivers.grep( DB_ADRESS_DRIVER ).empty() ) {

qDebug( QString( "Datenbanktreiber '%1' nicht geladen!" ).arg( DB_ADRESS_DRIVER ) );
return( -1 );
}

QSqlDatabase *defaultDB = NULL;

// create the default database connection
if( ( defaultDB = QSqlDatabase::addDatabase( DB_ADRESS_DRIVER ) ) == NULL ) {

qWarning( "Datenbanktreiber '%s' nicht verfuegbar!", (const char*) DB_ADRESS_DRIVER );
return( -1 );
} else {

if( defaultDB->lastError().type() != QSqlError::None ) {

qWarning( "!QSqlError::None" );
qWarning( defaultDB->lastError().databaseText() );

} else {

defaultDB->setDatabaseName( DB_ADRESS_DBNAME );
defaultDB->setUserName( DB_ADRESS_USER );
defaultDB->setPassword( DB_ADRESS_PASSWD );
defaultDB->setHostName( DB_ADRESS_HOST );

if( !defaultDB->open() ) {

qWarning( "!open" );
qWarning( defaultDB->lastError().databaseText() );
} else {

qDebug( "all okay" );
}
}
}

return 0;
}


Und die einzige Fehlermeldung, die ich bekam war:

!open
Host 'shadowland.matrix.internal' is not allowed to connect to this MySQL server

:)

michal
10-02-2003, 09:37
Es scheint so, als ob irgend etwas bei mir fehlt. Ich habe die Beispiele (und auch das von Dir TheDodger), die Trolltech mitliefert ausprobiert und siehe da: die gleiche Fehlermeldung wie in meinem ersten Posting (s.o.) angegeben.

Muß außer $QTDIR noch eine andere Shellvariable bezüglich Qt angeben werden:confused:

Habt eine gute Zeit!

Gruß
Micha

TheDodger
10-02-2003, 10:03
Nein, eigentlich nicht.
Was mir dann nur noch so einfällt, daß evtl. die xSQL Treiber defekt wären.
Hast du QT selber compiliert, oder per rpm installiert?

Verfolg doch mal den aufruf deines Programmes mit strace ...
'strace -e trace=file <prg-name>'
Vielleicht findert er die sql-shared-libs nicht?

anda_skoa
10-02-2003, 10:38
Vielleicht muss das Verzeichnis der SQL Plugins mit qtconfig eingetragen werden.

Ciao,
_

TheDodger
10-02-2003, 11:57
Also ich brauchte es nicht zu tun.
Dafür habe ich eine Datei namens '~/.qt/qt_plugins_3.1rc' da stehen sämtliche genutzte Plugins drin:


[usr]
kde/3.1/lib/kde3/plugins/designer/kdewidgets.so=30100^e3^ei686 Linux g++-3.* full-config^eMon Dec 9 10:54:35 2002^e
kde/3.1/lib/kde3/plugins/designer/libbwidgets.so=30100^e3^ei686 Linux g++-3.* full-config^eMon Nov 11 17:41:31 2002^e
kde/3.1/lib/kde3/plugins/styles/dotnet.so=30100^e3^ei686 Linux g++-3.* full-config^eTue Jan 28 03:23:42 2003^e
kde/3.1/lib/kde3/plugins/styles/highcolor.so=30100^e3^ei686 Linux g++-3.* full-config^eTue Jan 28 00:41:25 2003^e
kde/3.1/lib/kde3/plugins/styles/keramik.so=30100^e3^ei686 Linux g++-3.* full-config^eTue Jan 28 00:41:25 2003^e
kde/3.1/lib/kde3/plugins/styles/kthemestyle.so=30100^e3^ei686 Linux g++-3.* full-config^eTue Jan 28 00:41:25 2003^e
kde/3.1/lib/kde3/plugins/styles/light.so=30100^e3^ei686 Linux g++-3.* full-config^eTue Jan 28 00:41:25 2003^e
qt/3/plugins/designer/kdewidgets.so=30100^e3^ei686 Linux g++-3.* full-config^eMon Dec 9 10:54:35 2002^e
qt/3/plugins/designer/libbwidgets.so=30100^e3^ei686 Linux g++-3.* full-config^eMon Nov 25 06:09:49 2002^e
qt/3/plugins/designer/libcppeditor.so=30100^e3^ei686 Linux g++-3.* full-config^eFri Dec 20 08:59:20 2002^e
qt/3/plugins/designer/libdlgplugin.so=30100^e3^ei686 Linux g++-3.* full-config^eFri Dec 20 08:59:20 2002^e
qt/3/plugins/designer/libdllplugin.so=0^e0^e^0^eMon Feb 28 00:00:00 2935093^e
qt/3/plugins/designer/libkdevdlgplugin.so=30100^e3^ei686 Linux g++-3.* full-config^eFri Dec 20 08:59:20 2002^e
qt/3/plugins/designer/librcplugin.so=30100^e3^ei686 Linux g++-3.* full-config^eFri Dec 20 08:59:20 2002^e
qt/3/plugins/designer/libwizards.so=30100^e3^ei686 Linux g++-3.* full-config^eFri Dec 20 08:59:20 2002^e
qt/3/plugins/sqldrivers/libqsqlmysql.so=30100^e3^ei686 Linux g++-3.* full-config^eFri Dec 20 08:59:20 2002^e
qt/3/plugins/sqldrivers/libqsqlpsql.so=30100^e3^ei686 Linux g++-3.* full-config^eFri Dec 20 08:59:20 2002^e

[usr4qt]
qt/3/plugins/designer/libbwidgets.so=0^e0^e^0^eMon Feb 28 00:00:00 2935093^e

michal
11-02-2003, 11:16
Bin im Moment mit M$ am Netz :o .

Probiere aber, sobald ich wieder Zeit habe Eure Hinweise und berichte dann!

Danke dafür
Gruß Micha:)

michal
12-02-2003, 08:30
Hallo an alle!

Durch Eure letzten Hinweise bin ich auf folgendes Problem aufmerksam geworden:

- Es existierte aus einer vorherigen Installation eine Datei ~/.qt/qt_plugins_3.0rc
- Aktuell benutze ich jedoch Qt3.1.1, weshalb ich die oben angegebene Datei umbenannte und nur noch die auch vorhandene Datei ~/.qt/qt_plugins_3.1rc benutze.
- Da es immer noch nicht klappte, schaute ich bei qtconfig nach und fügte dort den Lib-Pfad /usr/lib/qt3.1.0/plugins hinzu, welcher sich noch auf meiner Platte aus der vorhergehenden Installation (selbst übersetzt) befand.
- jetzt funktioniert es.

Offenbar sind bei mir die Plugins von 3.1.1 nicht funktionsfähig oder werden erst gar nicht verwendet.

Wie macht ihr das, wenn eine neue Version installiert wird? Ich dachte es reicht den Symlink (bei mir /usr/lib/qt3) zu setzten. Gibt es eine Doku für die rc-Files oder hilft da nur probieren?

Viele Grüße
Micha (heute wieder mit Linux unterwegs :p )

TheDodger
12-02-2003, 09:24
Ich mache ein emerge qt und der rest erledigt sich absolut von selbst :)
Die Sourcen werden geholt und kompiliert.

Meine eigenen Erfahrungen mit div. SuSE-Version sagen allerdings, das bei einem Update immer was schief laufen kann.
Das letzte Mal, als ich QT kompiliert hatte, hatte ich mit den SQL-Treibern heftigere Probleme. Die sind mit einem SegFault wechgesemmelt ... da half nur ein Downgrade zur rpm Installation.
SuSE macht da wohl sehr eigenmächtige Sachen mit den Packeten
:confused:

michal
12-02-2003, 09:37
Ich werd' wohl erst einmal mit SuSE leben. Kann mich nicht so recht zu einer anderen Distri aufraffen. Aber eine Überlegung ist es allemal wert...

Bis zum nächsten "unlösbaren" ;) Problem!

Have fun
Micha

asteroix
16-07-2004, 09:19
Hi zusammen,

ich hatte das gleiche prob...
1. Ansatz....mit folgendem befehl (strace –e trace=file prg_file )
Path:/u/work/martin/database_connect strace –e trace=file prg_file
2> g.txt 1>&2
damit könnt ihr die bib -> zugriffe aus-tracen.
-> "2> g.txt 1>&2" nur nötig wenn in file gespeichert werden soll
Meine Lösung war dann (danke Michi!!!!!)
Bei allen SQL zugriffen:
das "xyz.pro" file editieren und bei CONFIG
eine neue Zeile
mit:
CONFIG += thread
einfügen!!!!

zum Beispiel:

SOURCES += connection.cpp \
main.cpp
HEADERS += connection.h
unix {
UI_DIR = .ui
MOC_DIR = .moc
OBJECTS_DIR = .obj
}
FORMS = metric.ui
TEMPLATE =app
CONFIG += qt warn_on release
CONFIG += thread
DBFILE = metric.db
LANGUAGE = C++

das wars hoffentlich
viel spass