1

私のWindowsアプリケーション(Cで記述)は、オフラインデータの保存にSQLite(埋め込まれた統合ソースを使用)を使用しており、マルチバイト文字セットのビルドでは問題がありませんでした。現在、コードベースをUnicodeに変換しています。SQLiteはUnicodeビルドで非常にうまく実行されており、UTF-16LEエンコーディングでSQLiteデータベースを作成しています。

しかし、私は1つの非常に奇妙なことに遭遇しました。クエリを実行するとPRAGMA journal_mode = DELETE(実際には、を含む許可された値のいずれかに設定するとOFF、同じことが行われます)、コードがデータベースを閉じるまですべてが正常に実行されます。データベースを閉じると、の呼び出しはエラーでsqlite3_close()戻ります。SQLITE_BUSY"unable to close due to unfinalised statements"

これは、データベースで実行する唯一のクエリがその単一のプラグマコマンドである場合でも発生します。他のプラグマ(たとえば"PRAGMA synchronous = NORMAL")とすべてのSQLクエリを正常に実行でき、データベースは非常に正常に閉じます。この奇妙な動作を引き起こしているのはこのプラグマだけjournal_modeであり、コードのUnicodeビルドでのみ-マルチバイトビルドではこの問題は発生しません。これは、データベースが[UTF-16LEモードで]すでに存在するかどうか、またはデータベースが最初に開いたときにデータベースを作成するかどうかに関係なく発生します。

何が間違っている可能性があるのか​​?SQLiteビルドv3.7.11を使用しています。

4

1 に答える 1

1

私は最終的に問題を見つけました。私自身のラッパーコードにありました。sqliteにはユニコードに相当する呼び出しがないためsqlite3_exec()、ユニコードバージョンを準備/ステップ/ファイナライズを行うコードにドロップスルーしました(呼び出し元がSQLクエリからデータを返したい場合)が、何らかの理由でjournal_modeプラグマを設定するとSqLiteはいくつかのデータを返しますが、これは私が設定した他のプラグマには当てはまりません。したがって、このプラグマだけに未完成のstmtがありました。

後で参照できるように、閉じるときにSQLITE_BUSYを取得した場合は、呼び出しsqlite3_next_stmt()て[next] unfinalisedステートメントsqlite3_sql()を取得し、それに関連付けられた準備済みのSQLステートメントを通知することができます。非常に便利!

于 2012-04-11T18:09:19.760 に答える