やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

QtでSQLite3を使いトランザクションしてみた

 これで最低限はできたか?

成果物

github.com

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 2018-06-27
  • Qt 5.7.1

前回

ソースコード抜粋

void MemoDb::Write(QStringList record)
{
    QSqlDatabase db = QSqlDatabase::database(this->dbName);
    db.transaction();
    try {
        QSqlQuery query(db);
        query.prepare("insert into Memo (Memo, DateTime) values (?, ?)");
        for (int i = 0; i < record.size(); i++) {
            query.bindValue(i, record[i]);
        }
        query.exec();
//        throw "SomeException";
        db.commit();
        qDebug() << "QSqlDatabase::commit()";
    } catch (...) {
        qDebug() << "QSqlDatabase::rollback()";
        db.rollback();
    }
}
  1. db.transaction();
  2. db.commit();
  3. db.rollback();

バグ修正

 ついでにファイルパスを渡すときのバグを修正した。

 前回はMyDbクラスのデフォルトコンストラクタを呼び出したときに、デフォルト引数./が設定されてしまっていた。if (!QSqlDatabase::contains(this->dbName))により1度しか実行されないため、そのまま./となり/home/piにDBファイルが出力されていた。

 今回はコンストラクタにパスを渡すことで解決した。

学んだこと

  • QSqlDatabase db = QSqlDatabase::database(this->dbName);
  • db.transaction();
  • db.commit();
  • db.rollback();
  • try {} catch(...) {}
  • throw "SomeException";

参考

所感

 定形処理をフレームワーク化したい。