2014-10-16 109 views
1

我在嘗試連接到一個Qt應用程序中的兩個不同數據庫時出現問題。我有我的信息數據庫,它存儲應用程序收集的所有信息以及新的日誌數據庫,使我能夠跟蹤應用程序,按鈕按鈕,屏幕加載等發生的所有更改,以便在其發佈後進行調試。另外,數據庫工作得很好,但是當我嘗試使用它們時,只有一個會起作用。我讀到這可能是因爲我沒有命名連接,顯然只有最近連接的數據庫才能使用默認連接。然而,當我把數據庫名,他們不會在所有的工作,ISOPEN()將返回兩個真實的,但只要他們試圖執行一個查詢我得到的錯誤QSqlDatabase連接到多個數據庫

"QSqlQuery::prepare: database not open" 

"QSqlError(-1, "Driver not loaded", "Driver not loaded")" 

我的兩個數據庫聲明是:

database_location = filepath.append("/logger.sqlite"); 
logDB = QSqlDatabase::addDatabase("QSQLITE", "LoggerDatabaseConnection"); 
logDB.setHostName("localhost"); 
logDB.setDatabaseName(database_location); 

記錄程序數據庫連接和:

database_location = filepath.append("/db.sqlite"); 
db = QSqlDatabase::addDatabase("QSQLITE", "NormalDB"); 
db.setHostName("localhost"); 
db.setDatabaseName(database_location); 

此外,當我運行在數據庫中的第一個查詢,看是否存在其表我使用

QSqlQuery query("LoggerDatabaseConnection"); 

對於普通數據庫也是這樣,但即使在聲明數據庫連接來運行查詢之後,我仍然遇到連接問題。

用於應用程序的數據庫在名稱空間中聲明爲靜態QSqlDatabase以創建全局效果,因此每個人都可以訪問它,這是以前的程序員,並且我創建了具有專用數據庫連接的Singleton Log數據庫。就像我說的那樣,兩個版本的代碼是分開工作的,但是當他們在一起時,他們正在互相爭鬥。我知道關於Singleton vs Dependecy Injection的正確設計存在着巨大的爭議,但代碼再次單獨運作,所以我很滿意現在的設計。如果有任何信息丟失或有任何想法,請告訴我。謝謝。

回答

3
QSqlQuery query("LoggerDatabaseConnection"); 

構造函數的第一個參數是查詢,而不是連接名稱。由於您沒有指定數據庫對象,它將使用默認連接。

嘗試是這樣的:

QSqlQuery query1("YourFirstQuery", db); 
QSqlQuery query2("YourSecondQuery", logDB); 

重要:也不要忘記使用它通過調用QSqlDatabase::open()QSqlDatabase::close()後打開和關閉數據庫之前/。

+0

我最終只是將數據庫與記錄器相結合,我試圖避免讓所有的模塊都保持一致。但是,我使用兩個數據庫連接並使用您所建議的語法開始了一個測試項目,而且似乎最終還是有效的。非常感謝您的寶貴時間。 – JordanTSI 2014-10-17 14:53:00