2017-05-01 27 views
0

我有一個atm應用程序,要求數據庫始終處於打開狀態(用戶登錄,所有信息都將收集並顯示在下一個表單上)。目前我正在每個表單的開頭添加數據庫,但我想知道是否有一種方法可以讓我在程序的開始時自動執行,並通過公共的db.start()和db.end()函數進行訪問類。如何爲所有表單申報公共數據庫

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 

我在everys窗體源文件的開頭有這個。

+1

A [單例類](http://stackoverflow.com/questions/1008019/c-singleton-design-pattern)可能是你在找什麼。 – m7913d

回答

3

見,如果這樣做的以下方式對你有用..

在你mainwindow構造函數到你的數據庫,並提供一個連接名稱。

QSqlDatabase atmDB = QSqlDatabase::addDatabase("QSQLITE","myConnection"); 
//Do all DB settings 
atmDB.setDatabaseName(.....); 
atmDB.setUserName(.....); 
atmDB.setPassword(.....); 
在你的.cpp文件,在任何你需要的呼叫 ::database,並用它

現在...

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

兩個::addDatabase::databaseQSqlDatabase靜態函數。

因此,上述的做法應該是有效的。

+0

嘿人出於某種原因當我第一次調用QSqlDatabase :: database()時,我的數據庫被打開,但當我在按鈕推功能內部調用它做一個查詢我得到錯誤QSqlQuery :: exec:數據庫未打開 – AlexAgla

+0

好的。 ..你通過你的連接名稱.. – Naidu

+0

另外,如果你只是調用:: database()....首先調用m mydb.open() – Naidu

0

ü應該定義一個singlete實例類,並在其中設置數據庫像

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

和功能

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

這樣詮釋你主要fnction

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