ADO.NETで遊ぶ

こんにちは!東京本社の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メンバに直接代入できない! どうやら読み取り専用のようだ。

そして僕は気づきました。

これ、そこまで深入りする内容じゃないな。