相关文章推荐

qt多线程操作数据库

在Qt中操作数据库的常用方式是使用Qt自带的Sql模块,它提供了多种数据库的支持,包括MySQL、SQLite、Oracle、PostgreSQL等等。

在多线程操作数据库时,由于数据库连接是线程不安全的,因此必须确保每个线程都有自己的数据库连接。一种常用的方式是在每个线程中创建一个独立的数据库连接,这样每个线程可以独立地访问数据库而不会发生冲突。

以下是一个使用Qt多线程操作数据库的示例代码:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QThread>
// 定义数据库连接类
class DbConnection
public:
    DbConnection()
        // 初始化数据库连接
        m_db = QSqlDatabase::addDatabase("QSQLITE");
        m_db.setDatabaseName("test.db");
        if (!m_db.open()) {
            qDebug() << "Database open failed!";
    ~DbConnection()
        // 关闭数据库连接
        m_db.close();
    // 获取数据库连接
    QSqlDatabase& getDatabase()
        return m_db;
private:
    QSqlDatabase m_db;
// 定义工作线程类
class WorkerThread : public QThread
public:
    WorkerThread(DbConnection* db)
        : m_db(db)
    void run() override
        // 在工作线程中操作数据库
        QSqlDatabase db = m_db->getDatabase();
        QSqlQuery query(db);
        query.exec("CREATE TABLE IF NOT EXISTS employee (id INT, name TEXT)");
        // 插入一条数据
        query.prepare("INSERT INTO employee (id, name) VALUES (?, ?)");
        query.addBindValue(1);
        query.addBindValue("Tom");
        query.exec();
        // 查询数据
        query.exec("SELECT * FROM employee");
        while (query.next()) {
            int id = query.value(0).toInt();
            QString name = query.value(1).toString();
            qDebug() << "id:" << id << " name:" << name;
private:
    DbConnection* m_db;
int main(int argc, char *argv[])
    QCoreApplication a(argc, argv);
    // 创建数据库连接
    DbConnection db;
    // 创建工作线程并启动
    WorkerThread thread1(&db);
    thread1.start();
    WorkerThread thread2(&db);
    thread2.start();
    // 等待工作线程结束
    thread1.wait();
    thread2.wait();
    return a.exec();

在上面的代码中,我们定义了一个DbConnection类用于创建和管理数据库连接。在WorkerThread工作线程中,我们首先获取DbConnection类中创建的数据库连接,然后可以对数据库进行操作,包括创建表、插入数据和查询数据等。

main函数中,我们首先创建了一个DbConnection对象,并将其传递给两个不同的WorkerThread线程。每个线程都会独立地获取自己的数据库连接,并对数据库进行操作。最后,我们等待所有工作线程结束,程序退出。

需要注意的是,在多线

  •  
    推荐文章