【问题标题】:Qt database error due to QSqlQuery object scope由于 QSqlQuery 对象范围导致的 Qt 数据库错误
【发布时间】:2012-03-26 07:26:01
【问题描述】:
#include <QtGui>
#include <QtSql>
#include <QApplication>

class   ABC {
public:
    QSqlDatabase db;
    QSqlQuery memberQuery;

    ABC() {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("test");
        qDebug() << "Database open test : " << db.open();

    }

    void    database() {
        qDebug() << "Inside database method..." << endl;
        QSqlQuery localQuery ;
        qDebug() << "Using local Query : " << localQuery.exec("create table if not exists alu (ini int)");
        localQuery.clear();

        qDebug() << "Using memeber query object: " << memberQuery.exec("create table if not exists alu (ini int)");
        memberQuery.clear();
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ABC ob;
    ob.database();

    return a.exec();
}

执行此代码后发现如下结果。

Database open test :  true 
Inside database method... 

Using local Query :  true 
QSqlQuery::exec: database not open
Using memeber query object:  false 

我的问题是为什么我不能使用成员对象 QSqlQuery 而不是本地对象?

【问题讨论】:

    标签: qt scope qtsql


    【解决方案1】:

    您需要使用QSqlQuery(QSqlDatabase db) 构造函数初始化您的QSqlQuery

    为此,您需要在构造函数中使用初始化器列表并已设置数据库连接,或者稍后使用指针初始化QSqlQuery

    使用 ABC 构造函数获取初始化的 DB(在 main 中创建 DB):

    ABC(QSqlDatabase _db) :
      db(_db),
      memberQuery(db)
    {
      Q_ASSERT(db.isOpen());
    }
    

    或者

    class ABC
    {
      QSqlDatabase db;
      QSqlQuery* memberQueryPtr;
    
      public:
        ABC() : db(QSqlDatabase::addDatabase("QSQLITE")),memberQueryPtr(0)
        {
          db.setDatabaseName("test");
          if (!db.open())
            return;
          memberQueryPtr = new QSqlQuery(db);
        }
    
        ~ABC()
        {
          delete memberQueryPtr; memberQueryPtr = 0;
        }
    
        // ...
    };
    

    【讨论】:

    • 那为什么本地对象不用db初始化也能工作?
    • 之所以有效,是因为添加数据库后,它成为默认连接,因此之后任何QSqlQuerycreated都会使用它。使用类属性时,QSqlQuery 在创建默认数据库连接之前被实例化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2021-10-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多