WinRT アプリで SQLite データベース ファイルにアクセスするために SQLite-net を使用しています。ExecuteQuery を使用してデータベースから読み取るのに問題はありません (テーブルマッピングを使用せず、下で ExecuteDeferredQuery を呼び出す辞書として結果を返します)。
を使用してデータベースにレコードを挿入しようとするExecuteNonQuery
と、"CannotOpen" というメッセージで例外が発生します。
上記の数行だけで、データベースから正常に読み取ることができます。sqlite データベース ファイルへのファイル アクセス許可を再確認し、ファイル アクセス許可の問題を回避するために、コンピューター上のすべてのユーザーにファイルを完全に制御できるようにしましたが、結果は同じで、「開くことができません」というメッセージが表示されます。
ExecuteNonQuery を使用して select ステートメントを実行しようとしましたが (動作するかどうかを確認するためだけに)、それでも例外が発生します。今回は、例外メッセージとして「Row」と表示されます。
何が起こるかを確認するために、ExecuteQuery を使用して挿入を実行しようとしました。例外はスローされず、すべて問題ないように見えますが、データベースに行が挿入されません。
ExecuteQuery は挿入ではなくクエリ用に設計されているため、これは説明できるかもしれませんが、ExecuteNonQuery が例外をスローする理由は何でしょうか?
これが私のコードです(プライバシーのために一般的なもので実際のテーブル名とパラメーターを削除しました):
SQLiteCommand cmd = conn.CreateCommand("insert into mytable(myfields...) values (?,?,?,?,?,?,?)", my parameters...);
cmd.ExecuteNonQuery(); //throws SQLiteException
ただし、このコードは例外をスローしません:
SQLiteCommand cmd = conn.CreateCommand("select * from mytable where some condition...", some parameters...);
var result = cmd.ExecuteToDictionary(); //renamed ExecuteQuery method from https://github.com/praeclarum/sqlite-net/issues/82
更新:この問題をさらに単純な (そして奇妙な) ものまで追跡しました。このコードは、接続の初期化後の SQLite フレームワークへの最初の呼び出しです。このコードを実行すると、4 行目で例外がスローされます。
SQLiteCommand cmd = conn.CreateCommand("select * from mytable");
cmd.ExecuteNonQuery();
cmd = conn.CreateCommand("select * from mytable"); //yes, the same simple query as above
cmd.ExecuteNonQuery();//getting error
更新 2 : ExecuteNonQuery の代わりに ExecuteToDictionary を呼び出すと、機能します。
UPDATE 3 :これらすべての呼び出しの前にconn
(などのオブジェクトからconn.Execute("query...")
)直接クエリを実行しようとすると、失敗します。挿入クエリならエラー、選択クエリならエラー。CannotOpen
Row
ExecuteNonQuery への 2 回目の呼び出しで例外が発生するのはなぜですか?
ExecuteNonQuery で SELECT を実行しようとすると、別のエラー メッセージ "Row" が表示されるのはなぜですか? そして最後に、なぜこれらの例外はユーザーフレンドリーではないのでしょうか?