建议楼主:使用队列,将要执行的SQL语句放入队列中(如:System.Collection.Queue或ArrayList),然后用一根线程一条一条执行,另外Access不支持事物回滚只有自己想办法实现了。滥用多线程会加大程序开发的难度,以及包括程序的不稳定。
另外:cbyvft的答案“……所有的线程使用同一个连接”
,是严重错误的!!连接对象Connection不能迸发,也就是不能多根线程共享一个连接对象,否则很容易引发异常(报错为:...基础对象与RAW分离之类的信息)。
若非要用多线程来做,我可以给你一段代码(我以前开发的项目中一部分),请加我的“百度Hi”并发消息给我,我传给你。
我不在这里帖代码了,因为实现的代码较多,而且比较复杂(使用多线程要考虑很多问题,代码要硕壮通用,所以代码量较大)。
#include <QCoreApplication>#include "thread.h"
#include <QVector>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv)
QVector<Thread*>vector
Thread *thread
//创建多个线程,并start
for(int i=0i<10i++){
thread=new Thread
vector.append(thread)
thread->set(i)
thread->start()
}
//等待所有线程执行完,然后删除线程
foreach(thread,vector){
thread->wait()
}
foreach(thread,vector){
delete thread
}
return a.exec()
}
-------------------------------------------------------------------------------------------------
#include "thread.h"
Thread::Thread(QObject *parent) : QThread(parent)
{
}
void Thread::run()
{
begin()
}
//为每个线程创建一个连接名
void Thread::set(int a)
{
connectionName=QString::number(a)
}
void Thread::connectionDatabase(QString dbName)
{
QSqlDatabasedb=QSqlDatabase::addDatabase("QMYSQL",connectionName)
db.setHostName("localhost")
db.setDatabaseName(dbName)
db.setUserName("root")
db.setPassword("")
if(!db.open())
qDebug()<<"db open fail"
}
void Thread::begin()
{
QString dbName="learnsql"
connectionDatabase(dbName)
QSqlDatabase db=QSqlDatabase::database(connectionName)
db.transaction()//开启事物
QSqlQuery query(db)
//向表student中插入10000条数据
for(int i=1i<=10000i++){
query.exec("insert into student values(1)")
}
db.commit()//提交事物
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)