Verbindung mit Postgres Datenbank

Alles rund um die Programmierung mit Qt
Antworten
WilliamSpiderWeb
Beiträge: 14
Registriert: 2. März 2011 23:14

Verbindung mit Postgres Datenbank

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Warum nicht so, wie es in der Doku steht?

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
WilliamSpiderWeb
Beiträge: 14
Registriert: 2. März 2011 23:14

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
WilliamSpiderWeb
Beiträge: 14
Registriert: 2. März 2011 23:14

Beitrag von WilliamSpiderWeb »

Jo, danke, hast recht.
WilliamSpiderWeb
Beiträge: 14
Registriert: 2. März 2011 23:14

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Warum machst du es nicht so, wie es in der QSqlDatabase-Doku steht? Du brauchst keine Pointer.
WilliamSpiderWeb
Beiträge: 14
Registriert: 2. März 2011 23:14

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