QT PostgreSQL Verbindung
-
Hallo,
vorab möchte ich sagen, daß ich erst vor kurzer Zeit mit QT und C++ angefangen habe. Ich blicke also noch nicht überall so richtig durch.
Ich versuche mich auf meinem lokalen Rechner (Win8/64bit) mit einer installierten PostgreSQL Datenbank zu verbinden und später dann SQL Befehle in dieser Datenbank über das Programm auszuführen. Das Programm läuft, ich erhalte aber folgende Meldung...
Error:
QSqlDatabase: QPSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7 Error
Das QT Programm ist wie folgt aufgebaut:
// In der .pro steht QT += sql // In der .cpp steht #include <QSqlDatabase> #include <QtSql> void MainWindow::on_pushButton_RunImport_clicked() { QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); db.setHostName("localhost"); db.setDatabaseName("4DB"); db.setUserName("postgres"); db.setPassword("dbpass"); if(!db.open()) ui->label->setText("Connection Failed!"); else ui->label->setText("Connected"); }
Nun habe ich schon den ganzen Tag nach dem Grund für die Meldung gesucht. Anscheinend muss ich noch irgend welche Treiber Dateien für die SQL Verbindung einbinden oder den einen Pfad angeben. Könnte mir jemand auf die Sprünge helfen, was ich wo noch einfügen muss, damit der Compiler die Treiber sieht.
Folgende Dateien befinden sich im Ordner:
C:\Qt\5.3\winrt_x64\plugins\sqldriversqsqlite.dll
qsqlited.dll
qsqlited.pdbIst eine QT Creator 3.1.1 Standard Installation...
Gruss
-
Musst halt das PSql Plugin bauen. Bei mir liegt er Qt\src\sql\drivers\psql. Wenn du danach googelst, findest du sicher genug Infos.
-
Hallo,
das mit dem Plugin bauen habe ich leider nicht geschafft. Nun habe ich ein neues Setup und entscheide mich für den bau einer 32bit Applikation.
Folgende Installation unter Windows 8.1 (64bit) mit Visual Studio 2013...
a) Qt 5.3.1 for Windows 32-bit (VS 2013, 559 MB)
b) Visual Studio Add-in 1.2.3 for Qt5Versuche mit postgresql 9.0 (32bit) eine Verbindung herzustellen...
#include "key.h" #include <postgresql/libpq-fe.h> key::key(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); // postgresql database connection PGconn *dbconn = NULL; PGresult *query; dbconn = PQconnectdb("user=postgres password=dbpass dbname=4DB hostaddr=localhost port=5432"); if (PQstatus(dbconn) == CONNECTION_BAD) { ui.label->setText("Connection Failed!"); } if (PQstatus(dbconn) != CONNECTION_BAD) { ui.label->setText("Connected"); } }
Als erstes habe ich Fehlermeldungen für 2 Dateien erhalten...
a) libpq-fe.h
b) postgres_ext.hNun habe ich diese in meiner postgresql 9.0 (32bit) Installation gesucht, gefunden und nach C:\Qt\Qt5.3.1\5.3\msvc2013\include\postgresql kopiert. Fehler behoben! Nun erhalte ich die folgenden 2 Fehler...
1>key.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_PQconnectdb" in Funktion ""public: __thiscall key::key(class QWidget *)" (??0key@@QAE@PAVQWidget@@@Z)". 1>key.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_PQstatus" in Funktion ""public: __thiscall key::key(class QWidget *)" (??0key@@QAE@PAVQWidget@@@Z)".
Ich muss wohl noch Pfade in Visual Studio eintragen, aber wo, welche und wie?
Wäre dankbar für jeden Tip. Gruss
-
Habe folgendes gefunden...
Quelle: http://www.forum-3dcenter.org/vbulletin/archive/index.php/t-388424.html
Library-Verzeichnis eintragen unter Tools->Options->Projects->VC++ Directories
Und dann noch bei den Projekteinstellungen unter Linker, Input bei Additional Dependencies die lib selber.
Nun habe ich folgendes gemacht...
key.cpp (rechte Maustaste)->Eigenschaften->Konfigurationseingenschaften->C/C++->Allgemein->Zusätzliche Includeverzeichnisse
hier habe ich noch eingetragen: $(QTDIR)\include\postgresql;
Leider keine Besserung. Kann mir jemand erklären, was ich wo noch eintragen muss?
-
Du musst es dem Linker bekanntmachen. Includeverzeichnis gehört nicht zum Linker, sondern zum Compiler.
-
Hört sich logisch an, für einen Anfänger aber verwirrend...
Also...
Projekt (rechte Maustaste)->Properties->Linker->Input->Additional Dependencies
Dort eingetragen: "C:\Program Files\PostgreSQL\9.0\lib";
key.cpp (rechte Maustaste)->Configuration Properties->C/C++->General->Additional Include Directories
Dort eingetragen: "C:\Program Files\PostgreSQL\9.0\include";
key.cpp (rechte Maustaste)->Configuration Properties->C/C++->General->Additional #using Directories
Dort eingetragen: "C:\Program Files\PostgreSQL\9.0\bin";
Ergebnis:
LINK : fatal error LNK1104: cannot open file 'C:\Program Files\PostgreSQL\9.0\lib.obj'
Was muss wo stehen?
-
Bei "Additional Dependencies" mußt du den konkreten Namen der Bibliothek (lib) eintragen (nicht den Pfad), also "qsqlite".
Aber dies hattest du doch selbst zitiert
-
Was ich zitiert habe, stammt aus dem Jahr 2007 und bezieht sich auf C & Visual Studio 2005. Ich nutze C++ & Visual Studio 2013 & Qt passend dazu.
Aber welche lib muss ich dort eintragen? Ich habe nun nicht den Pfad sondern jede .lib aus diesem Ordner dort eingetragen:
"C:\Program Files\PostgreSQL\9.0\lib\libecpg_compat.lib"; "C:\Program Files\PostgreSQL\9.0\lib\libecpg.lib";" C:\Program Files\PostgreSQL\9.0\lib\libpgtypes.lib"; "C:\Program Files\PostgreSQL\9.0\lib\libpq.lib"; "C:\Program Files\PostgreSQL\9.0\lib\libpgport.lib"; "C:\Program Files\PostgreSQL\9.0\lib\postgres.lib";
Dann erhalte ich aber wieder den Fehler:
1>key.obj : error LNK2019: unresolved external symbol _PQconnectdb referenced in function "public: __thiscall key::key(class QWidget *)" (??0key@@QAE@PAVQWidget@@@Z) 1>key.obj : error LNK2019: unresolved external symbol _PQstatus referenced in function "public: __thiscall key::key(class QWidget *)" (??0key@@QAE@PAVQWidget@@@Z) 1>M:\Dokumente - C++\Visual Studio 2013\key\Win32\Debug\\key.exe : fatal error LNK1120: 2 unresolved externals
Wie kann ich eine Verbindung zur postgresql Datenbank einrichten?
-
Neuer Versuch mit Visual Studio 2013 (64bit) & QT 5.3.1 (32bit) als Addin auf eine lokal installierte PostgreSQL 9.0 (32bit) Datenbank zuzugreifen.
Einstellungen in Visual Studio 2013
a) Properties->C/C++->General->Additional Include Directories: "C:\Program Files\PostgreSQL\9.0\include";
b) Properties->Linker->General-> Additional Libary Directories: "C:\Program Files\PostgreSQL\9.0\lib";
c) Properties->Linker->Input->Additional Dependencies: libpq.libDann habe ich noch folgende files kopiert...
a)
Von... C:\Program Files\PostgreSQL\9.0\bin nach.. Visual-Studio-Projekt\Win32\Debug und nach... Visual-Studio-Projekt\Win32\Release libeay32.dll libiconv-2.dll libintl-8.dll libpq.dll libxml2.dll libxslt.dll ssleay32.dll zlib1.dll
b)
Von... C:\Qt\Qt5.3.1\5.3\msvc2013\plugins\sqldrivers nach.. Visual-Studio-Projekt\Win32\Debug und nach... Visual-Studio-Projekt\Win32\Release qsqlpsql.dll
mein key.cpp code:
#include "key.h" #include <libpq-fe.h> key::key(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); // postgresql database connection PGconn *dbconn = NULL; PGresult *query; dbconn = PQconnectdb("user=postgres password=dbpass dbname=4DB hostaddr=localhost port=5432"); if (PQstatus(dbconn) == CONNECTION_BAD) { ui.label->setText("Connection Failed!"); } if (PQstatus(dbconn) != CONNECTION_BAD) { ui.label->setText("Connected"); } }
Und ich erhalte wieder den Fehler:
1>key.obj : error LNK2019: unresolved external symbol _PQconnectdb referenced in function "public: __thiscall key::key(class QWidget *)" (??0key@@QAE@PAVQWidget@@@Z) 1>key.obj : error LNK2019: unresolved external symbol _PQstatus referenced in function "public: __thiscall key::key(class QWidget *)" (??0key@@QAE@PAVQWidget@@@Z) 1>M:\Dokumente - C++\Visual Studio 2013\key\Win32\Debug\\key.exe : fatal error LNK1120: 2 unresolved externals
-
CodePerfect schrieb:
c) Properties->Linker->Input->Additional Dependencies: libpq.lib
Prüf das nochmal nach.
Kompilierst du dein Programm denn auch im 32-bit-Modus, wenn du schon die Libs nur in 32-bit hast?
-
Hallo,
ja...Debug/Win32
Ich fasse meinen aktuellen Lösungsweg noch einmal zusammen:
Folgende Installation unter Windows 8.1 (64bit) mit Visual Studio 2013...
a) Qt 5.3.1 for Windows 32-bit (VS 2013, 559 MB)
b) Visual Studio Add-in 1.2.3 for Qt5Visual Studio 2013 läuft mit Qt und ich habe ein erstes Qt GUI mit einem Button (objectName->pushButton) und einem Label (objectName->label) gebaut.
In MyApp.h steht nun folgendes:
#ifndef MyApp_H #define MyApp_H #include <QtWidgets/QMainWindow> #include "ui_MyApp.h" #include <QSqlDatabase> #include <QtSql> class MyApp : public QMainWindow { Q_OBJECT public: MyApp(QWidget *parent = 0); ~MyApp(); private: Ui::MyAppClass ui; // begin new code public slots: void on_pushButton_clicked() { QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); db.setHostName("localhost"); db.setDatabaseName("4DB"); db.setUserName("postgres"); db.setPassword("dbpass"); if (!db.open()) ui.label->setText("Connection Failed!"); else ui.label->setText("Connected"); } // end new code }; #endif // MyApp_H
Der Visual Studio Fehler im Debug Mode lautet:
'MyApp.exe' (Win32): Loaded 'C:\Qt\Qt5.3.1\5.3\msvc2013\plugins\sqldrivers\qsqlpsqld.dll'. Symbols loaded. 'MyApp.exe' (Win32): Unloaded 'C:\Qt\Qt5.3.1\5.3\msvc2013\plugins\sqldrivers\qsqlpsqld.dll' QSqlDatabase: QPSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
GUI läuft, Verbindung klappt nicht. Nun habe ich viel recherchiert und einiges versucht. U.a. habe ich in den Visual Studio 2013 Projekteinstellungen folgendes eingetragen...
a) Properties->C/C++->General->Additional Include Directories: "C:\Program Files\PostgreSQL\9.0\include";
b) Properties->Linker->General-> Additional Libary Directories: "C:\Program Files\PostgreSQL\9.0\lib";
c) Properties->Linker->Input->Additional Dependencies: libpq.libAuch habe ich einmal die .dll der PostgreSQL Installation in andere Verzeichnisse kopiert...
Von... C:\Program Files\PostgreSQL\9.0\bin nach.. Visual-Studio-Projekt\Win32\Debug und nach... Visual-Studio-Projekt\Win32\Release libeay32.dll libiconv-2.dll libintl-8.dll libpq.dll libxml2.dll libxslt.dll ssleay32.dll zlib1.dll
Egal was ich mache, die Verbindung klappt nicht
-
Ich werd es heute Abend daheim mal nach deiner Vorgehensweise testen.
Aber wenigstens funktioniert jetzt das Kompilieren.
Edit: Sorry, verpeilt... Muss Qt und PostgreSQL noch installieren, wird wohl erst später ^^
-
Das würde mich freuen...Gruss
-
Das würde mich freuen...Gruss
-
Sorry, ich schaff es nicht so richtig, das Qt Addin zu installieren. Bekomme zwar das Qt Menü in VS, aber keine Projekt Templates.. Kann also keine Qt Projekte anlegen.