addDatabase的函数原型如下:
[static] QSqlDatabase QSqlDatabase::addDatabase(
const QString &type,
const QString &connectionName = QLatin1String( defaultConnection ))
//第一个参数为“驱动名称”
//第二个参数为“连接名”,默认是相同的
注意这个函数有第二个参数!!!
今天遇到的问题就是:一个项目需要用到两个数据库,我就想先打开数据库,然后把所有数据库的句柄先保存起来,后面可以直接使用。
但是现在出现一个问题就是:所有保存下来的句柄之后最后一个是valid的,前面的全部都是invalid的,导致能用的只有最新的句柄,但是原先的句柄都失效了。
代码如下:
void openDBs()
{
g_mapDBs.clear();
for (auto it = g_mapDBTables.constBegin(); it != g_mapDBTables.constEnd(); ++it)
{
QSqlDatabase db = QSqlDatabase::addDatabase(QString(it.key().driver));
db.setDatabaseName(QString(it.key().dbName));
db.setPassword(QString(it.key().password));
db.setHostName(QString(it.key().hostName));
db.setPort(it.key().port);
db.setUserName(QString(it.key().userName));
if (!db.open())
{
qDebug() << db.lastError();
continue;
}
//这一步我原意是想将这个db保存下来,留待后面直接使用,但是结果不尽如人意
g_mapDBs[it.key()] = db;
}
}
这个问题困扰了好久,后面还是问我经理解决的。
问题就在于QSqlDatabase::addDatabase函数有第二个参数,这个参数为“连接名”,这个连接名是唯一的。
但是在默认情况下,这个连接名是一样的,这就导致后面的db会把前面的db覆盖掉,就会导致前面的db失效。
解决方法:在有多个数据库的情况下,为每个db都添加上一个不同的连接名。
代码如下:
void openDBs()
{
......
for (auto it = g_mapDBTables.constBegin(); it != g_mapDBTables.constEnd(); ++it)
{
//注意我在这里为每个数据库添加了不同的连接名
QSqlDatabase db = QSqlDatabase::addDatabase(QString(it.key().driver),
QString(it.key().connectionName));
......
}
}
这样之后,可以有两种使用方式:
1.每次使用addDatabase重新创建,但是因为连接名是唯一的,这样后面得到的这个db就是我们需要的db;
2.只打开一次,然后将这个db保存下来,后面直接使用。