SqliteCommandをExecuteReader()と組み合わせつつDisposeせずに使い続けると例外が起きる
iOSシミュレータでMonoTouchプログラムをデバッグしていると、Mono.Data.Sqlite.UnsafeNativeMethods.sqlite3_prepareで例外が発生するようになった。
MonoTouch 4.0.3と4.0.4.1とMono2.10.2の組み合わせ全てで問題がおきる。
この例外、MonoDevelopではキャッチすることができずNative stacktraceを吐くだけで終了してしまう。
そしてこの問題は実機では発生しない。
NovelのBugzillaに似たような事例があったがマルチスレッドが原因の旨のコメントだけだった。
結局他の問題の調査中に原因が判明した。
SqliteCommandをExecuteReader()と組み合わせつつ、Disposeせずに使い続けると例外が起きる事が判った。
void Test() { SqliteCommand cmd = con.CreateCommand(); cmd.CommandText = "SELECT * FROM test"; IDataReader reader = cmd.ExecuteReader(); // <-そのうちExecuteReader()の中で例外が起きる while(reader.Read()){...略...} }
SqliteCommandをusingで囲むか明示的にDisposeを呼ぶだけで回避できた。
void Test() { using (SqliteCommand cmd = con.CreateCommand()) { cmd.CommandText = "SELECT * FROM test"; IDataReader reader = cmd.ExecuteReader(); while(reader.Read()){...略...} } }
IDataReaderもDisposeするべきなだろうが今回の問題には関係が無かった。
おそらくMono.Data.Sqliteになにかしらの不備があるのではないだろうか。