在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
线程。每个线程都会独立地获取自己的数据库连接,并对数据库进行操作。最后,我们等待所有工作线程结束,程序退出。
需要注意的是,在多线