2012-03-26 8 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(); 
} 

Folgendes Ergebnis wird nach der Ausführung dieses Codes gefunden.Qt-Datenbankfehler aufgrund des QSqlQuery-Objektbereichs

Meine Frage ist, warum kann ich nicht ein Mitgliedsobjekt QSqlQuery anstelle eines lokalen verwenden?

Antwort

3

Sie müssen Ihre mit dem QSqlQuery(QSqlDatabase db) Konstruktor initialisieren.

Dazu müssen Sie Initialisierungslisten im Konstruktor verwenden und haben bereits die DB-Verbindung eingerichtet, oder verwenden Sie Zeiger, um die QSqlQuery später zu initialisieren.

Mit einem ABC Konstruktor eine initialisierte DB unter (Erstellen der DB in main):

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

Oder

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

Warum funktioniert das lokale Objekt Arbeit mit db witout initializaing? – Dewsworld

+1

Es funktioniert, weil nach dem Hinzufügen der Datenbank, wird es die Standardverbindung, so dass jede 'QSqlQuery'created danach verwendet wird. Wenn Sie eine Klasseneigenschaft verwenden, wird QSqlQuery vor dem Erstellen der Standard-DB-Verbindung instanziiert. – Koying