【发布时间】:2011-04-28 02:49:10
【问题描述】:
当我尝试在 SQLite 数据库上运行更新查询时出现此错误。这只发生在 XP 上(在 Vista 上工作正常)。数据库创建没有任何问题,插入也可以正常工作。 我还检查了,我有可用的权限和磁盘空间(正如 sqlite.org 所说,这些都是可能的原因)。
【问题讨论】:
标签: sqlite windows-xp io
当我尝试在 SQLite 数据库上运行更新查询时出现此错误。这只发生在 XP 上(在 Vista 上工作正常)。数据库创建没有任何问题,插入也可以正常工作。 我还检查了,我有可用的权限和磁盘空间(正如 sqlite.org 所说,这些都是可能的原因)。
【问题讨论】:
标签: sqlite windows-xp io
对我有用的一个答案是使用PRAGMA 语句将journal_mode 值设置为“DELETE”以外的值。您可以通过发出诸如PRAGMA journal_mode = OFF 之类的PRAGMA 语句来执行此操作,方法与发出查询语句的方式相同。我在http://www.stevemcarthur.co.uk/blog/post/some-kind-of-disk-io-error-occurred-sqlite/http://www.stevemcarthur.co.uk/blog/post/some-kind-of-disk-io-error-occurred-sqlite/发布了一个使用 c# 的示例
编辑
可能更好的 PRAGMA 声明是 PRAGMA journal_mode = TRUNCATE,而不是其他几个人建议的“关闭”。
【讨论】:
另一种可能是使用以下 SQL 语句
"PRAGMA journal_mode = TRUNCATE"
它仍然保留日志,因此如果在事务期间电源发生故障,您仍然可以回滚,并且可以避免数据库损坏。 DELETE 和 TRUNCATE 之间的区别在于 delete 会不断地为每个语句创建和删除日志文件。
截断只需要创建一次并覆盖它。就我而言,它要快得多,而且我避免了标准 journal_mode = DELETE 附带的奇怪权限。
【讨论】:
数据库文件旁边有 .db-journal 文件吗?如果是这样,请确保您的应用程序可以删除数据库所在文件夹中的文件。
您的症状表明SQLite可以读写但无法删除日志文件。
【讨论】:
每个http://www.sqlite.org/pragma.html#pragma_journal_mode(强调我的):
OFF 日志模式完全禁用回滚日志。从未创建回滚日志,因此永远不会删除回滚日志。 OFF 日志模式禁用 SQLite 的原子提交和回滚功能。 ROLLBACK 命令不再起作用;它的行为方式未定义。当日志模式关闭时,应用程序必须避免使用 ROLLBACK 命令。 如果在设置了 OFF 日志模式时应用程序在事务中崩溃,那么数据库文件很可能会损坏。
听起来您走在正确的轨道上,但其他选项之一会更安全。
【讨论】: