前面,写了一篇关于解决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
不知道为什么会是这样的结果,但的确测试下来就是这样。希望知道的留言告知。更希望对遇到这样问题的同行以参考。