View Full Version : Qt Check if there is an open database connection
ShapeShiftme
10th February 2012, 02:19
Good day all.
Im currently using this code in my project to open a mysql database file
..... mydatabase.cpp....
bool myDatabase::createDatabaseConn()
{
QSettings settings("ATSTech", "ats_shopfront");
settings.beginGroup("database");
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName(settings.value("server").toString());
db.setDatabaseName("dbname");
db.setUserName(settings.value("databaseUsername").toString());
db.setPassword(settings.value("databasePassword").toString());
if (!db.open()) {
//QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
return false;
}
return true;
settings.endGroup();
}
No when i use this from my other pages like so
myDatabase *getinfo = new myDatabase();
getinfo->createDatabaseConn();
i get the following warinings/errors
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
Is there any way to in the code at the top to check if there is already a connection and if so use that one instead of removing and creating a new one to the database.
im sure that would make things faster aswell
regards
Donovan Hoare
Lesiok
10th February 2012, 07:56
First use addDatabase like this :
bool myDatabase::createDatabaseConn()
{
QSettings settings("ATSTech", "ats_shopfront");
settings.beginGroup("database");
QSqlDatabase db = QSqlDatabase::database();
if( db.isValid() )
return true;
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName(settings.value("server").toString());
db.setDatabaseName("dbname");
db.setUserName(settings.value("databaseUsername").toString());
db.setPassword(settings.value("databasePassword").toString());
if (!db.open()) {
//QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
return false;
}
return true;
settings.endGroup();
}
Spitfire
13th February 2012, 16:57
First when adding a database, name the connection:
QSqlDatabase::addDatabase( "QMYSQL", "OneNameOrOther" );
Then use that name to query for the connection:
if( QSqlDatabase::contains( "OneNameOrOther" ) )
{
QSqlDatabase db = QSqlDatabase::database( "OneNameOrOther" );
// now do some stuff with it
}
else
{
// connection not found, do something
}
KillGabio
13th February 2012, 17:19
Spitfire has the answer ;)
ShapeShiftme
17th February 2012, 03:43
First when adding a database, name the connection:
QSqlDatabase::addDatabase( "QMYSQL", "OneNameOrOther" );
Then use that name to query for the connection:
if( QSqlDatabase::contains( "OneNameOrOther" ) )
{
QSqlDatabase db = QSqlDatabase::database( "OneNameOrOther" );
// now do some stuff with it
}
else
{
// connection not found, do something
}
According to your device i changed my code to this
QSettings settings("ATSTech", "StockManager");
settings.beginGroup("database");
/* if( QSqlDatabase::contains( "StockManagerConn" ) )
{
QSqlDatabase db = QSqlDatabase::database( "StockManagerConn" );
qDebug()<<"Database Open : Using Stockmanager Connection";
return true;
}
else
{*/
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","StockManagerConn");
db.setHostName(settings.value("server").toString());
db.setDatabaseName("stockmanager");
db.setUserName(settings.value("databaseUsername").toString());
db.setPassword(settings.value("databasePassword").toString());
if (!db.open()) {
QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
return false;
}
qDebug()<<"Database Opened : Started Stockmanager Connection";
return true;
//}
settings.endGroup();
but i started getting this error
Database Opened : Started Stockmanager Connection
QSqlQuery::exec: database not open
ERROR : inserting Company Name QSqlError(-1, "Driver not loaded", "Driver not loaded")
As soon as i remove the connection name it works great.
What could i possibly be doing wrong.
Regards
Spitfire
17th February 2012, 09:43
You're showing wrong part of your code.
Error is generated by the part that executes a query not sets up the database.
You're probably not using connection name there.
When creating the query you have to specify which connection you want to use:
QSqlQuery query( QSqlDatabase::database( "StockManagerConn" ) );
otherwise it will fall back on the default name and fail.
ShapeShiftme
17th February 2012, 09:57
You're showing wrong part of your code.
Error is generated by the part that executes a query not sets up the database.
You're probably not using connection name there.
When creating the query you have to specify which connection you want to use:
QSqlQuery query( QSqlDatabase::database( "StockManagerConn" ) );
otherwise it will fall back on the default name and fail.
Thank you so much you are right.
When declaring my QSqlQuery i changed it to add the connection and it worked great.
You are a star.
Spitfire
17th February 2012, 10:01
I'm glad I could help :)
Take care!
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions Inc. All rights reserved.