PostgreSQL 9.4 QT 5.5 Trouble with connection string. #[SOLVED]
-
I have installed PostgreSQL 9.4 and created a database called "test"
I created a user role_name "mark" with a password "apple"
I get the following error when I compile and run.Error: QSqlError("", "QPSL: Unable to connect", "fe_sendauth: no password supplied\n")
I am totally new to PostgreSQL as well as a Noobe with QT
I have read many posts from the web on compiling the drivers but the one I went with simply says to copy 4 of the .DLL files from the PostgreSQL install bin folder to the QT mingw bin folder.
libeay32
libintl.dll
libpq.dll
ssleay32.dllI did that and from the error message it looks as though the driver is working.
Not sure what the actual ServerName is suppose to be. Looking at the PgAdmin the servers Service ID is what I used.
Code is from an example made by VoidRealms although his example used the "QODBC" connection.
Any advice much appreciated to get me started here.
The program code:
#include <QCoreApplication> #include <QtSql> #include <QtDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString servername = "LOCALHOST\\postgresql-9.4"; QString dbname = "test"; QString user = "mark"; QString pword = "apple"; QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); db.setConnectOptions(); QString dsn = QString("*DRIVER={SQL Native Client};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4").arg(servername).arg(dbname).arg(user).arg(pword); db.setDatabaseName(dsn); if(db.open()) { qDebug() << "Opened"; db.close(); } else { qDebug() << "Error:" << db.lastError(); } return a.exec(); }
The applications.pro code
QT += core QT += sql QT -= gui TARGET = dbapp CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp
I added some error output using qDebug()
Trying to figure out myself I can see db.database returns no username.qDebug() << "\nError:" << db.lastError() << "\n\nConnection Name:" << db.connectionName() << "\n\nDatabase:" << db.database() << "\n\nDatabase Name:" << db.databaseName();
After blowing some steam off by walking 5 miles I returned to see if I could figure it out.
The resulting code works. I created a console application.
Baby steps.
Don't forget to put those .DLL files mentioned above in the correct directory./* The PostgreSQL database I created using pgAdmin Name "test" Table name "testtable" Column1 "id" type = bigserial Column2 'address' type = character varying */ // I dont know any Russian but this video is what I watched to get me going. // https://www.youtube.com/watch?v=fBgJ9Azm_S0 #include <QCoreApplication> #include <QtSql> #include <QtDebug> #include <QSqlQuery> #include <QtCore> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString dbname = "test"; QString user = "mark"; QString pword = "apple"; QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); db.setPort(5432); db.setHostName("localhost"); db.setDatabaseName(dbname); // Create a SQL Query Object QSqlQuery query; if(db.open(user,pword)) { qDebug() << "Opened"; // We will delete all the data and then add two records query.exec("delete from testtable"); qDebug() << query.lastError(); query.exec("insert into testtable(address) values('Rice Street')"); qDebug() << query.lastError(); query.exec("insert into testtable(address) values('Xerxes Road')"); qDebug() << query.lastError(); // Execute a query if ( query.exec("SELECT * FROM testtable")) { qDebug() << "Query Success!"; // We have to call the next() method to point to the first record. query.next(); // To skip backwards one record we can call the previous() method // query.previous(); // The in memory column fields data are in an array named value() // The first column has the index value of zero not 1 we call this zero based indexing. // So our field "id" is value(0) and our field "address" is value(1) qDebug() << "First Record in Table field = " << query.value(1).toString(); query.next(); qDebug() << "Second Record in Table field = " << query.value(1).toString(); QString tableAddress = query.value(1).toString(); qDebug() << tableAddress; // Lets change some data in the second records address field // Using QTextStream we will build a query string that has the old address to be used // in the WHERE command. We will use the query string variable in the query.exec() command. // **NOTE** // I understand using the QSqlQuery::bindValue() is a better way to do this. // That will be my next exploration. For now though I'm happy to be able to connect // to a postgreSQL database read and write to a table. QString queryString; QTextStream queryStream(&queryString); queryStream << "UPDATE testtable SET address = '5523 Baymont Street' WHERE address ='" << tableAddress << "'"; qDebug() << queryString; query.exec(queryString); qDebug() << query.lastError(); query.exec("SELECT * FROM testtable"); query.next(); qDebug() << "First Record in Table field = " << query.value(1).toString(); query.next(); qDebug() << "Second Record in Table field = " << query.value(1).toString(); } else { qDebug() << "Query Failed to Execute"; qDebug() << "query.lasterror() = " << query.lastError(); } db.close(); } else { qDebug() << "\nError:" << db.lastError() << "\n\nConnection Name:" << db.connectionName() << "\n\nDatabase:" << db.database() << "\n\nDatabase Name:" << db.databaseName(); } return a.exec(); }
The applications.pro file
QT += core QT += sql QT -= gui TARGET = dbapp CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp