1

我的 Windows 应用程序(用 C 编写)使用 SQLite(使用嵌入式合并源)来存储离线数据,并且在多字节字符集构建中没有任何问题。我现在将代码库转换为 Unicode。SQLite 非常愉快地使用 Unicode 构建运行,以 UTF-16LE 编码创建 SQLite 数据库。

不过,我遇到了一件非常奇怪的事情。如果我运行查询PRAGMA journal_mode = DELETE(实际上,将其设置为任何允许的值,包括OFF,执行相同的操作),一切都运行良好,直到代码关闭数据库,此时调用sqlite3_close()返回SQLITE_BUSY,并出现错误"unable to close due to unfinalised statements"

即使我在数据库上运行的唯一查询是单个 pragma 命令,也会发生这种情况!我可以很好地运行其他 pragma(例如"PRAGMA synchronous = NORMAL")和我的所有 SQL 查询,并且数据库将非常愉快地关闭;正是这个journal_mode编译指示导致了这种奇怪的行为,并且仅在代码的 Unicode 构建中 - 多字节构建没有显示这个问题。无论数据库是否已经存在 [在 UTF-16LE 模式下],或者它是否在第一次打开时创建它,都会发生这种情况。

有什么想法可能是错的吗?我正在使用 SQLite 构建 v3.7.11。

4

1 回答 1

1

我最后发现了问题。在我自己的包装代码中。由于 sqlite 没有 unicode 等效调用sqlite3_exec(),我让 unicode 版本直接进入我的准备/步骤/完成的代码(当调用者想要从 SQL 查询返回数据时),但由于某种原因设置 journal_mode 杂注导致SqLite 返回一些数据,它不用于我设置的其他 pragma - 因此只有这个 pragma 有一个未最终确定的 stmt。

为了将来参考,如果你在关闭时得到 SQLITE_BUSY,你可以调用sqlite3_next_stmt()来获取 [next] 未完成的语句,然后sqlite3_sql()让它告诉你与之关联的准备好的 SQL 语句。很有用!

于 2012-04-11T18:09:19.760 回答