前言
最近项目遇到需求,每批芯片有上千颗,需要在一个温度点下完成所有的数据采集后,存入数据库,换芯片,采集,直到一批芯片全部采集完。由于这个数量级,想要将所有数据存在本地内存已经是很不现实很不方便了,所以必须引入数据库,以解决数据量的问题。
所以需要使用SQLite数据库,轻量,好用。而Qt与数据库交互需要用到的便是 QSqlDatabase相关的方法了。
本文章仅记录该次工作所用到的方法和流程。
方法变量一览
QSqlDatabase db;
数据库交互的共用变量,管理与数据库的连接,所以需要声明在头文件。
db = QSqlDatabase::addDatabase("QSQLITE","connect1");
db.setDatabaseName(QApplication::applicationDirPath()+tr("/test.db"));
db.open();
此处为初始化数据库相关的内容,通过 addDatabase 来进行数据库类型(QSQLITE)和连接名称(connect1)的声明。因为本次内容为SQLITE,故第一个参数填QSQLITE,此外若为MYSQL,可填QMYSQL。第二个参数为非必要参数,用以在多个数据库建立连接时,做名字区分,不然会相互顶替连接。
setDatabaseName,在SQLITE中就是设置文件路径,若没有文件则创建文件,MySQL则是命名数据库。
open,开启与数据库的连接,任何sql语句都只有连接状态才能正确执行。
QSqlQuery query(db);
bool success = query.exec("CREATE TABLE Mydatas("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"dataA INTEGER,"
"dataB INTEGER,"
"Result INTEGER)");
QSqlQuery query(db);
QString sql = QString("UPDATE Mydatas SET Result = %2 WHERE id = %1")
.arg(a).arg(b);
query.prepare(sql);
bool result = query.exec();
query.finish();
执行SQL语句,可以通过 QString 字符串拼接实现数据绑定,也可通过 bindvalue 实现数据绑定。执行后一定要记得finish掉query,不然可能会影响事务的提交与回滚。
db.transaction();
db.commit();
db.rollback();
事务方法很简单,通过 transaction 开启事务,往后所有的 sql 操作都算在事务当中,完成一个事务后通过 commit 提交事务,通过 rollback 回滚事务。这里需要注意每个 sql 操作前可能会有 db.open 检查操作,必须去掉,不然数据库的重新开启会关闭事务,导致 commit rollback 失败。
if(res1&&res2){
if(!QSqlDatabase::database().commit()){
QMessageBox::critical(this,"Error","操作失败,将要回滚");
if(!QSqlDatabase::database().rollback()){
QMessageBox::critical(this,"Error","回滚失败");
}
}else{
doShowBackResult();
//qDebug()<<"show ";
}
}else{
qDebug()<<query.lastError();
QMessageBox::critical(this,"Error","操作失败,将要回滚");
if(!QSqlDatabase::database().rollback()){
QMessageBox::critical(this,"Error","回滚失败");
qDebug()<<QSqlDatabase::database().lastError();
}
}
上为标准事务写法,带错误信息。