再谈QSqlQuery::exec: database not open问题的解决

前面,写了一篇关于解决QSqlQuery::exec: database not open的博文,解决的方案是在QSqlQuery初始化的时候为其指定数据库。但我们明明链接好了唯一的数据库,为什么还要在这里为其指定数据库呢?这样太不方便了!这就失去了QSqlQuery的灵活性(相对QSqlQueryModel QSqlTableModel来说QSqlQuery的特点就是灵活)。

在测试时发现如果数据库连接成功后,立即声明一个QSqlQuery而不为其指定数据库来初始化是可以正常操作数据库的。
测试代码如下:

 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("database1.db");
    if(!db.open()) return false;
    else
    {
        printf("connect successed! \n");
        return true;
    }
   QSqlQuery s; 
    s.exec("select * from student");
    if(s.first())
    qDebug()<<s.value(1).toString();
    s.next();

后来,我将数据库连接单独封装在一个函数中,通过调用连接函数可以无数据声明的初始化

bool QueryDialog::connectDataBase( )
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("database1.db");
    if(!db.open()) return false;
    else
    {
        printf("connect successed! \n");
        return true;
    }

}

void QueryDialog::on_test_clicked()
{
if(connectDataBase())
 {
   qDebug()<<"OK!";
   QSqlQuery query;
   query.exec("select * from student");
     while(query.next())
     {

         QString id= query.value(0).toString();
         QString name = query.value(1).toString();

         qDebug()<<name;
         qDebug()<<id;


     }
 }
 }

进一步试验,我将QSqlQuery 的声明、数据库连接以及调用连接分开编写在三个函数,也可以进行无数据库声明的初始化:

bool QueryDialog::connectDataBase( )
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("database1.db");
    if(!db.open()) return false;
    else
    {
        printf("connect successed! \n");
        return true;
    }

}
void QueryDialog::on_test_clicked()
{
if(connectDataBase())
 {
   qDebug()<<"OK!";
 
 }
}
void QueryDialog::on_pushButton_clicked()
{
      QSqlQuery s; //这里的QSqlQuery的定义一般都要在事件里面定义
    s.exec("select * from student");
    if(s.first())
    qDebug()<<s.value(1).toString();
    s.next();
}

但,一时贪心起来了,我就想,是不是可以声明一个QSqlQuery 对象,随时调用,到处调用呢?
我将QSqlQuery 在头文件中声明,结果:
QSqlQuery::exec: database not open
程序开起来是没有报错,但提示数据库无法打开。
同样,我将QSqlQuery 放置在cpp文件的class声明之前,作为本文件中的公共变量声明,最后也得到的是:
QSqlQuery::exec: database not open
不知道为什么会是这样的结果,但的确测试下来就是这样。希望知道的留言告知。更希望对遇到这样问题的同行以参考。

你可能感兴趣的:(QT,Sqlite,database,qt,数据库,QSqlQuery,sqlite)