数据库基本使用过程:
1,使用QSqlDatabase::addDatabase()函数获取数据库驱动。
2,使用setDatabaseName()获取数据库。
3,使用open()打开数据库
4,打开后进行插入,删除,查询等操作
5,耗时操作后关闭数据库资源
本地数据库操作
Unmy_sql = QSqlDatabase::addDatabase("QSQLITE");
Unmy_sql.setDatabaseName(DbName);
if(Unmy_sql.open())
{
table_list = Unmy_sql.tables();//获取数据库中的表
//打开后进行一系列操作
}
else
{
QMessageBox::critical(this,QObject::tr("open db failed"),"无法链接数据库",
QMessageBox::Cancel);
}
启动线程现象:
开启多条线程,线程中通过数据库的基本操作后发现,出现程序异常终止,
在这一过程中,线程之间是相互不影响,会出现线程1正在使用数据库资源,线程2,3,
4也会进行调用,出现了资源的竞争,从而出现程序崩溃,
解决方法:
因为在线程1使用数据库资源还未完成时,其他线程就已经将·资源抢走,线程1操作数据
库会失败,线程2,3,4也会失败;解决思路,在线程1使用数据库资源时让其他线程等待线程
1数据库操作结束;数据库上锁解锁操作。线程安全,在获取线程驱动时,添加定义数据库驱动id,
代码片段:
{
QSqlDatabase my_sql = QSqlDatabase::addDatabase("QSQLITE",id);
my_sql.setDatabaseName(DbName); //得到数据库
if(my_sql.open())
{
mutex.lock(); //上锁
QString sql = QString("select * from %1 ").arg(tablename);
QSqlQuery query(QSqlDatabase::database(id)); //区分数据库连接ID 绑定数据库
if (!query.exec(sql)){
qDebug() <<id<<"错误:"<< query.lastError().text();
}
QSqlRecord sqlRecord(query.record());
int row_num = sqlRecord.count();
while(query.next()){//表数据
}
mutex.unlock(); //解锁
}
else{
qDebug()<<id<<" Open Failed";
}
}
QSqlDatabase::removeDatabase(id); //线程安全
注意:
代码片段的最外花括号一定要保留,id是QString类型;有问题的欢迎讨论。
--------------------------------END------------------------------