Seite 1 von 1

Verbindung mit Postgres Datenbank

Verfasst: 23. März 2011 19:27
von WilliamSpiderWeb
Ich bin grad etwas verwirrt.
Ich bekommen die Verbindung zu meiner Datenbank nicht hin.

Das ist mein Code:

Code: Alles auswählen

    QSqlDatabase db;
    db.addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setPort(5433);
    db.setUserName("postgres");
    db.setPassword("***");
    db.setDatabaseName("qt");
    db.open("postgres", "***");
    if (db.isOpen() == true)
        ui->lineEdit->setText("true");
    else
        ui->lineEdit->setText("false");

    QStringList slDrivers = db.drivers();
    ui->lineEdit2->setText(slDrivers.join(" "));


    QSqlError dbError = db.lastError();
    QString sError = dbError.text();
    ui->lineEdit3->setText(sError);
Ergebnisse in den lineEdits:
1: false
2: QSQLITE QODBC3 QODBC QPSQL7 QPSQL
3: Driver not loaded Driver not loaded

Warum ist der Treiber nicht geladen, obwohl der Treiber verfügbar ist?

Grüße, Alex

Verfasst: 23. März 2011 19:35
von upsala
Warum nicht so, wie es in der Doku steht?

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");

Verfasst: 23. März 2011 19:58
von WilliamSpiderWeb
Tja, gute Frage... hatte bei meinem ersten Versuch, glaub ich, nicht so richtig funktioniert.

Hab's jetzt noch einmal so gemacht, wie Du geschrieben hast und bekomme nun folgende Debug-Ausgabe
This version of PostgreSQL is not supported and may not work.
Ich benutze PostgreSQL 9.0 und das QPSQL Plugin hatte ich auch mit dieser Version erstellt. Warum kommt dann diese Fehlermeldung?

Verfasst: 23. März 2011 20:10
von upsala
Qt kann nur mit den Versionen 7.0-7.3 und 8.0-8.2 umgehen. Alle anderen Versionen werden als Version 6 erkannt und erzeugen die von dir genannte Fehlermeldung.
Eigene Abfragen mit QSqlQuery sollten aber trotzdem funktionieren.

Verfasst: 23. März 2011 20:30
von WilliamSpiderWeb
Jo, danke, hast recht.

Verfasst: 26. März 2011 21:17
von WilliamSpiderWeb
sorry, dass ich noch einmal wegen der DB-Verbindung posten muss. Hab aber derzeit folgendes Szenario.

QSqlDatabase *db ist ein member meiner Klasse CPostgresDB. Diese Klasse soll mir das handlen der ganzen Datenbankzugriffe etwas erleichtern.

Die folgende Funktion soll die Verbindung mit meiner Datenbank herstellen.

Code: Alles auswählen

bool CPostgresDB::open(QString Host, int Port, QString User, QString Pass, QString DB)
{
    db = new QSqlDatabase;
    *db = QSqlDatabase::addDatabase("QPSQL");
    db->setHostName(Host);
    db->setPort(Port);
    db->setUserName(User);
    db->setPassword(Pass);
    db->setDatabaseName(DB);
    db->open();
    if (db->isOpen() == true)
        return(true);
    else
        return(false);
}
Allerdings stürzt mein Programm in der Zeile
db->open();
ab.

Im Debugmodus erscheint an der Stelle folgende Messagebox
Der Prozess wurde nach Erhalt eines Signals vom Betriebssystem angehalten.
Name des Signals: SIGSEGV
Bedeutung: Segmentation fault
Ich habe anschließend direkt vor der Zeile db->open(); folgende Befehle eingefügt, um weitere Informationen über den Status meiner db einzuholen. Könnte ja sein, dass ich an früherer Stelle einen Fehler gemacht habe, der sich erst hier auswirkt.
QSqlError error = db->lastError(); --> ergab keinen Fehler
db->isDriverAvailable("QPSQL"); --> ergab true
db->isOpen(); --> ergab false
db->isValid(); --> ergab true
Wäre schön, wenn mir noch mal jemand helfen könnte.

Verfasst: 26. März 2011 21:32
von upsala
Warum machst du es nicht so, wie es in der QSqlDatabase-Doku steht? Du brauchst keine Pointer.

Verfasst: 26. März 2011 22:22
von WilliamSpiderWeb
Ja, Du hast recht, ohne Pointer funktioniert es.

Ich geh mal davon aus, dass Du mit QSqlDatabase-Doku die Klassen Referenzen von Nokia oder Trolltec meinst.

Um Deine Frage zu beantworten... Unwissenheit... Ich hoffe, im weiteren Projektverlauf lerne ich die Doku besser zu nutzen.