2019.11.22
こんにちは!東京本社のIです!
ADO.NETプロバイダでSQLiteに接続してみる。
どうやら、「System.Data.SQLite」と「Microsoft.Data.Sqlite」というのがあるようだ。
「System.Data.SQLite」は、SQLiteチームが開発したもの。
「Microsoft.Data.Sqlite」は、Microsoftが開発したものらしい。
試しにNugetから両方落としてみる。
準備完了。よーし、わざとエラーを出してやるぞ!
一度コミットしたトランザクションを、連続コミットだ!
連続コミット攻撃を仕掛けるコードを書いてデバッグ実行。ほれ、ポチっとな。
当然2回目のコミットのところで例外が発生する、のだが、よくよく見てみるとプロバイダによって例外の内容が違う。
「System.Data.SQLite」は、
"値を Null にすることはできません。\r\nパラメーター名:No connection associated with this transaction"
というエラー内容で、ArgumentNullException。
「Microsoft.Data.Sqlite」は、
"This SqliteTransaction has completed; it is no longer usable."
というエラー内容で、InvalidOperationException。
両者ロジックが違うようだ。
トランザクションに関連付けたコネクションがないと判定するか、トランザクションが完了済だと判定するか。
ん? 値がNull? トランザクションクラスに「Connection」というメンバがあるが、これのことか?
一度コミットするとConnectionメンバはNullになるが、そこに無理やり代入したらどうなる?
さっそく試してみよう。代入っ!
…できない!! Connectionメンバに直接代入できない! どうやら読み取り専用のようだ。
そして僕は気づきました。
これ、そこまで深入りする内容じゃないな。
- 2020年
- 2019年
- 2018年