Qt跨線程使用遇到的問題

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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章