1、 程序中用一个类封装了一个操作数据库文件的方法,但是我需要在不同的窗口中调用该数据库(多个应用连接数据),如果我在不同窗口中分别定义了该数据库类的变量,运行的过程中会出现以下警告:
QSqlDatabasePrivate::removeDatabase: connection 'nice' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'nice', old connection removed.
解决方法:
即在定义该数据库变量时,传递一个字符参数,该参数作为QSqlDatabase::addDatabase("QSQLITE",name),从而可区分不同连接到数据库的连接,即不会出现上述警告的出现。
serverDataBase::serverDataBase(QString name)
{
bool create = !QFile::exists("Database.db"); // 判断该数据库是否存在
db = QSqlDatabase::addDatabase("QSQLITE",name); // 创建QSqlDatabase对象,
并且指定QSQLITE驱动程序来访问该数据库。
qDebug()<<"QSQLITE driver valid" <<db.isValid();
db.setDatabaseName("Database.db"); // 设置该数据库的名字。
qDebug()<<db.lastError();
if (!db.open()) // 判断该数据库是否能够打开。
{
QMessageBox::warning(NULL, tr("Error"),tr("Can not open the sqlite database"));
exit(2);
}
if(create) // 判断该数据库是否存在,不存在就创建。
createTable();
qDebug()<<QSqlDatabase::drivers(); // 打印支持SQL的驱动.
}
2、运行数据库插入数据时,出现如下错误:
QSqlQuery::prepare: database not open
从以上错误信息可是看出是操作该数据库的驱动没有加载成功,而出现这种情况有两个原因:
其一:QT软件包中没有支持db = QSqlDatabase::addDatabase("QSQLITE",name); 该函数中第一个参数的
驱动,需要人为手动添加该驱动。
其二:就是在调用该数据库成员函数的方法时,没有指定该驱动的指针,也会导致该问题的发生(我就是出现在这个问题下)
解决方法:
使用 query时 加一句 : query = QSqlQuery(db); 这个就可以关联到你之前 db打开的那个数据库了,这样 query 才能 在 db_name 这个数据库中执行操作.
示例代码:
/*
功能: 注册新用户(添加).
para1: 用户注册信息.
返回值: 返回注册结果(用户已存在,新用户注册成功)
*/
qint32 serverDataBase::registerNewUser(QString userMess)
{
qint32 replyKind;
QSqlQuery query;
query = QSqlQuery(db);
//查询用户是否存在.
query.prepare("select count(account) from users where account=:account");
query.bindValue(":account", userMess.mid(0,8));
query.exec();
errorSQLOrder(query, "registerRequest1");
query.next();
//用户已经存在.
if(query.value(0).toInt() != 0)
{
replyKind = REGISTER_EXIST;
return replyKind;
}
//添加用户.
query.prepare("insert into users values(:acc, :pwd, :mobile)");
query.bindValue(":acc", userMess.mid(0,8));
query.bindValue(":pwd", userMess.mid(8,6));
query.bindValue(":mobile", userMess.mid(14,11));
query.exec();
errorSQLOrder(query, "registerRequest2");
replyKind = REGISTER_SUCCESS;
return replyKind;
}