gpt4 book ai didi

c - 在 unicode 和 PRAGMA journal_mode 设置时,SqLite 数据库不会关闭

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:34 25 4
gpt4 key购买 nike

我的 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 pragma 导致了这种奇怪的行为,并且仅在代码的 Unicode 构建中——多字节构建没有显示这个问题。无论数据库已经存在 [以 UTF-16LE 模式],还是在第一次打开时创建它,都会发生这种情况。

任何想法可能是错误的?我正在使用 SQLite build v3.7.11。

最佳答案

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

供将来引用,如果您在关闭时得到 SQLITE_BUSY,您可以调用 sqlite3_next_stmt() 来获取 [next] unfinalised statement,然后调用 sqlite3_sql() 来获取它告诉你与之关联的准备好的 SQL 语句。非常有用!

关于c - 在 unicode 和 PRAGMA journal_mode 设置时,SqLite 数据库不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10086713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com