QtでSQLite3を使いトランザクションしてみた
これで最低限はできたか?
成果物
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 2018-06-27
- Qt 5.7.1
前回
- http://ytyaru.hatenablog.com/entry/2019/12/24/000000
- http://ytyaru.hatenablog.com/entry/2019/12/23/000000
- http://ytyaru.hatenablog.com/entry/2019/12/22/000000
- http://ytyaru.hatenablog.com/entry/2019/12/21/000000
ソースコード抜粋
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(); } }
db.transaction();
db.commit();
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";
参考
所感
定形処理をフレームワーク化したい。