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

11 篇文章 2 订阅

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

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
如果你仍然遇到 "QSqlQuery::exec: database not open" 和 "QSqlQuery::prepare: database not open" 错误,尽管你确认数据库连接已经正确打开,那么可能是由于以下原因之一: 1. 链接名称问题:确保在使用 `QSqlQuery` 对象时,传递了正确的数据库连接名称。在你的代码中,连接名称为 "connect"。请使用 `QSqlDatabase::database()` 方法以及正确的连接名称来获取数据库连接。 ```cpp QSqlDatabase db = QSqlDatabase::database("connect"); QSqlQuery query(db); ``` 2. 数据库驱动程序问题:确保你使用的数据库驱动程序已正确加载,并与你的数据库类型兼容。可以使用 `QSqlDatabase::drivers()` 方法检查可用的数据库驱动程序列表。如果需要,尝试使用其他驱动程序或更新驱动程序版本。 3. 编译问题:如果你使用了外部数据库驱动程序库,如SQLite或MySQL,确保在编译和链接应用程序时正确设置了库路径和库文件。特别是在使用外部库时,Qt的插件系统可能需要额外的步骤来加载和使用这些库。 4. 数据库文件路径问题:再次检查数据库文件的路径是否正确,并且你有足够的权限读取该文件。如果数据库文件位于受限制的目录中(例如系统目录或只读目录),请尝试将其移动到其他位置,并确保你可以访问该位置。 如果以上方法仍然无法解决问题,请提供更多的上下文信息、代码示例和错误信息,以便我能够更详细地帮助你解决问题
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河西石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值