qt 多线程执行mysql数据库插入操作
时间: 2023-05-17 09:04:49 浏览: 233
可以使用 Qt 的 QSqlDatabase 和 QSqlQuery 类来执行 MySQL 数据库插入操作。在多线程环境下,需要注意数据库连接的线程安全性,可以使用 QMutex 或 QReadWriteLock 来保证线程安全。以下是一个示例代码:
```cpp
#include <QtSql>
#include <QThread>
class DatabaseWorker : public QObject
{
Q_OBJECT
public:
DatabaseWorker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void insertData(const QString &name, int age)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("mydatabase");
db.setUserName("myusername");
db.setPassword("mypassword");
if (!db.open()) {
qWarning() << "Failed to connect to database:" << db.lastError().text();
return;
}
QSqlQuery query(db);
query.prepare("INSERT INTO mytable (name, age) VALUES (:name, :age)");
query.bindValue(":name", name);
query.bindValue(":age", age);
if (!query.exec()) {
qWarning() << "Failed to insert data:" << query.lastError().text();
return;
}
qDebug() << "Data inserted successfully:" << name << age;
}
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
DatabaseWorker worker;
QThread thread;
worker.moveToThread(&thread);
thread.start();
QObject::connect(&app, &QCoreApplication::aboutToQuit, &thread, &QThread::quit);
QObject::connect(&worker, &DatabaseWorker::insertData, &worker, &DatabaseWorker::insertData, Qt::QueuedConnection);
worker.insertData("Alice", 20);
worker.insertData("Bob", 30);
worker.insertData("Charlie", 40);
return app.exec();
}
```
这个示例代码演示了如何在多线程环境下执行 MySQL 数据库插入操作。在主线程中创建一个 DatabaseWorker 对象,并将其移动到一个新的线程中。然后,通过信号槽机制将插入数据的请求发送到 DatabaseWorker 对象中执行。在 DatabaseWorker 对象中,首先创建一个 QSqlDatabase 对象,并设置连接参数。然后,创建一个 QSqlQuery 对象,并使用 prepare() 方法准备 SQL 语句。接着,使用 bindValue() 方法绑定参数,并执行 SQL 语句。最后,通过 qDebug() 输出插入数据的结果。注意,这里使用了 Qt::QueuedConnection 来确保插入数据的请求在新线程中执行。
阅读全文