2012-03-26 31 views
0
#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(); 
} 

執行此代碼後發現以下結果。由於QSqlQuery對象範圍導致的Qt數據庫錯誤

Database open test : true 
Inside database method... 

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

我的問題是爲什麼我不能使用成員對象QSqlQuery而不是本地的?

回答

3

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

爲此,您需要在構造函數中使用初始化列表,並且已經設置了數據庫連接,或者稍後使用指針來初始化QSqlQuery

隨着ABC構造服用初始化的DB(在主創建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; 
    } 

    // ... 
}; 
+0

那麼爲什麼本地對象的工作不用其他與DB initializaing? – Dewsworld 2012-03-26 08:23:03

+1

它的工作原理是因爲在添加數據庫之後,它成爲默認連接,因此之後創建的任何'QSqlQuery'都將使用它。當使用類屬性時,QSqlQuery在創建默認數據庫連接之前被實例化。 – Koying 2012-03-26 09:50:16