2017-05-01 3 views
0

Ich habe eine ATM-App, die erfordert, dass eine Datenbank zu jeder Zeit geöffnet ist (Benutzer meldet sich an, alle Informationen werden gesammelt und im nächsten Formular angezeigt). Zur Zeit füge ich die Datenbank am Anfang jedes Formulars hinzu, aber ich frage mich, ob es eine Möglichkeit für mich gibt, automatisch am Anfang des Programms und über die Funktionen db.start() und db.end() in einer öffentlichen Datenbank zuzugreifen Klasse.So deklarieren Sie eine öffentliche Datenbank für alle Formulare

atmDB = QSqlDatabase::addDatabase("QSQLITE"); 
atmDB.setDatabaseName(Path_to_DB); 
QFileInfo checkFile(Path_to_DB); 

if(!atmDB.open()){ 
    ui->regStatus->setText("No connection to log-in database!"); 
} 
else 
    ui->regStatus->setText("Database connected!");enter code here 

Ich habe dies am Anfang von Everys Form Quelldatei.

+1

A [Singletonklasse ] (http://stackoverflow.com/questions/1008019/c-singleton-design-pattern) möglicherweise das, was Sie suchen. – m7913d

Antwort

3

Prüfen Sie, ob die folgende Art und Weise zu tun, für Sie nützlich ist ..

In Ihrem mainwindow Konstruktor Ihre Datenbank hinzufügen und einen Verbindungsnamen geben.

QSqlDatabase atmDB = QSqlDatabase::addDatabase("QSQLITE","myConnection"); 
//Do all DB settings 
atmDB.setDatabaseName(.....); 
atmDB.setUserName(.....); 
atmDB.setPassword(.....); 

Jetzt in Ihren CPP-Dateien, wo immer Sie Anruf erforderlich ::database und es verwenden ...

QSqlDatabase mydb = QSqlDatabase::database("myConnection",true);//by defualt second parameter is true,which opens the connection. 
// 
// 
//YOUR BUSINESS 
// 
// 
mydb.close(); 

Sowohl ::addDatabase und ::database sind statische Funktionen von QSqlDatabase.

Also sollte der obige Weg der Arbeit funktionieren.

+0

Hey Mann aus irgendeinem Grund meine DB wird geöffnet, wenn ich zuerst die QSqlDatabase :: database() aufrufen, aber wenn ich es innerhalb einer Schaltfläche Push-Funktion aufrufen, um eine Abfrage zu tun, bekomme ich den Fehler QSqlQuery :: exec: Datenbank nicht geöffnet – AlexAgla

+0

Ok. .. hast du deinen Verbindungsnamen weitergegeben .. – Naidu

+0

Auch wenn du nur :: database() anrufst .... rufe zuerst m mydb.open() auf – Naidu

0

u eine singlete Instanzklasse definieren sollte, und legen Sie Datenbank in es wie

class DB 
{ 
public: 
static DB& instance(); 
bool getDB(); 
bool isOpen(); 
bool open(); 
bool close(); 
} 

und in Funktionen

bool getDB() 
{ 
Mutex mutex; 
if (!isOpen()) 
{ 
return open(); 
} 
return true; 
} 

so int Sie Haupt fnction

int main() 
{ 
DB::instance().open() 
// you code... 
DB::instance().close(); 
} 
Verwandte Themen