0%

前言

  最近项目遇到需求,每批芯片有上千颗,需要在一个温度点下完成所有的数据采集后,存入数据库,换芯片,采集,直到一批芯片全部采集完。由于这个数量级,想要将所有数据存在本地内存已经是很不现实很不方便了,所以必须引入数据库,以解决数据量的问题。
  所以需要使用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();
    }
}

上为标准事务写法,带错误信息。