QT中使用QSqlDatabase 时出现的问题。

来源:互联网 发布:深圳行知美术学校 编辑:程序博客网 时间:2024/06/11 00:36

      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;
    }