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

时间:2012-04-10 10:05:36

标签: c unicode sqlite

我的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 synchronous = NORMAL")和我的所有SQL查询,数据库将非常愉快地关闭;只是这个journal_mode编译指示导致了这种奇怪的行为,并且只在代码的Unicode构建中 - 多字节构建没有显示这个问题。无论数据库是否已存在[以UTF-16LE模式],或者是否在首次打开时创建数据库,都会发生这种情况。

任何想法都可能出错?我正在使用SQLite build v3.7.11。

1 个答案:

答案 0 :(得分:1)

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

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