PDA

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!