2015-05-15 107 views
0

在我的構造函數(QT 5.4.1 - Windows 7中):爲什麼isOpen()函數總是返回true?

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName(":memory:"); 
db.open(); 

QSqlQuery q; 
q.exec("create table authors(num integer, birthdate date)"); 
q.exec("insert into authors values('123', '2015-01-01')"); 
qDebug()<<"your info saved in db."; 

每一個東西是好的,到現在爲止,但後來,我需要改變我的數據庫,並永久保存某個日期,所以:

int Dialog::SaveInfosPermanent() 
{ 

    QSqlDatabase::database().close(); 
    if (QSqlDatabase::database().isOpen()) { 
     qDebug()<<"DB is open."; 
     return 1; 
    } 

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName("newDB.db"); 
    db.open(); 

    QSqlQuery q; 
    q.exec("create table authors(num integer, birthdate date)"); 
    q.exec("insert into authors values('123', '2015-01-01')"); 
    qDebug()<<"your info saved in db."; 

    return 0; 
} 

輸出:

your info saved in db. 
QSqlError("", "", "") 
DB is open. 

那我做錯了嗎?或者如果用戶選擇某個複選框,還有更好的其他想法可以將db從內存更改爲硬盤?

+4

您知道'QSqlDatabase :: database()'在默認情況下也會打開數據庫連接嗎?如果它不是你想要的,那麼你必須指定'open'參數:'QSqlDatabase :: database(「QSQLITE」,false).isOpen()' –

回答

0

對我來說,初始化數據庫連接的最佳方法是使用連接名稱:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName); 

隨着連接名稱你有一些額外的機會。 從數據庫連接列表中刪除數據庫中,找到文檔here

QSqlDatabase::removeDatabase(connectionName); 

獲得通過名稱來訪問你的數據庫,發現文檔here

QSqlDatabase db = QSqlDatabase::database(connectionName); 

在你的情況使用removeDatabase()與連接的名稱,但不要忘記db的範圍。請參閱我附上的鏈接中的示例。

您也可以在這兩種情況下使用數據庫具有相同的名稱,作爲docs說:

添加一個數據庫來使用的驅動程序 類型和連接名稱的connectionName數據庫連接列表。如果已經存在名爲connectionName的數據庫連接,則刪除該連接。

數據庫連接由connectionName引用。新添加的數據庫連接將返回 。

+0

那麼你現在是什麼意思?你的意思是我現在無法使用默認名稱關閉連接? – Musa

+0

我的意思是,如果你不確定你的連接關閉使用安全的方式來做到這一點 –

相關問題