Ошибка базы данных Qt из-за области действия объекта QSqlQuery - PullRequest
0 голосов
/ 26 марта 2012
#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 вместо локального?

1 Ответ

3 голосов
/ 26 марта 2012

Вам нужно инициализировать QSqlQuery с помощью конструктора QSqlQuery(QSqlDatabase db).

Для этого вам нужно будет использовать списки инициализаторов в конструкторе и уже настроить соединение с БД или использовать указатели для инициализации QSqlQuery позже.

С конструктором ABC, принимающим инициализированную БД (создайте БД в основном):

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

    // ...
};
...