1.最近將Qt5.5.1的項目升級到了5.12.2,寫數據庫出現問題。報下面的錯誤。
QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlQuery::exec: database not open
QSqlError("", "Driver not loaded", "Driver not loaded")
原因是在子線程調用主線程創建的數據庫連接,查資料後發現是不允許這麼用的。
2.想的解決方案是在子線程重新創建一個連接。但本着節省資源的原則,刪除主線程的連接(只用來初始化數據庫)
在創建連接的最後面,調用移除數據庫連接的方法,
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","default");
db.setDatabaseName("database.db");
// 打開數據庫
if (!db.open()) {
qDebug() << database.lastError();
qFatal("failed to connect.");
}
QSqlDatabase::removeDatabase("default");
出現下面的錯誤:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
錯誤的意思是連接正在使用,通過查資料瞭解到賦值給db導致引用計數加1。解決的方法很簡單。把創建連接的代碼放到括號內。
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","default");
db.setDatabaseName("database.db");
// 打開數據庫
if (!db.open()) {
qDebug() << database.lastError();
qFatal("failed to connect.");
}
}
QSqlDatabase::removeDatabase("default");
3.在創建了多個數據庫連接時,若要獲取其中一個已知的連接。若連接爲創建,則創建連接
QSqlDatabase db;
if(QSqlDatabase::contains("default"))
{
db = QSqlDatabase::database("default");
}
else
{
db = QSqlDatabase::addDatabase("QSQLITE","default");
db.setDatabaseName("database.db");
db.open();
}