2

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..."))直接クエリを実行しようとすると、失敗します。挿入クエリならエラー、選択クエリならエラー。CannotOpenRow

ExecuteNonQuery への 2 回目の呼び出しで例外が発生するのはなぜですか?

ExecuteNonQuery で SELECT を実行しようとすると、別のエラー メッセージ "Row" が表示されるのはなぜですか? そして最後に、なぜこれらの例外はユーザーフレンドリーではないのでしょうか?

4

2 に答える 2

0

他の操作を実行する前に、接続オブジェクトを閉じてから開いてみてください

于 2013-06-23T08:43:24.697 に答える