异常消息:发生某种磁盘I / O错误

时间:2010-10-20 15:07:09

标签: sqlite windows-xp io

当我尝试在SQLite数据库上运行更新查询时,我收到此错误。这只发生在XP上(在Vista上工作正常)。创建数据库没有任何问题,插入也工作正常。 我也检查过,我有权限和磁盘空间可用(因为sqlite.org说这些是可能的原因)。

4 个答案:

答案 0 :(得分:13)

对我有用的一个答案是使用PRAGMA语句将journal_mode值设置为“DELETE”以外的值。您可以通过发出诸如PRAGMA journal_mode = OFF之类的PRAGMA语句来执行此操作,方法与发出查询语句的方式相同。我使用c#at http://www.stevemcarthur.co.uk/blog/post/some-kind-of-disk-io-error-occurred-sqlite/

发布了一个示例

修改

可能更好的PRAGMA声明是PRAGMA journal_mode = TRUNCATE而不是“OFF”,正如其他几个人所建议的那样。

答案 1 :(得分:3)

Per http://www.sqlite.org/pragma.html#pragma_journal_mode(强调我的):

  

OFF日记模式完全禁用回滚日志。永远不会创建回滚日志,因此永远不会有要删除的回滚日志。 OFF日记模式禁用SQLite的原子提交和回滚功能。 ROLLBACK命令不再有效;它的行为方式不明确。应用程序必须避免在日志模式为OFF时使用ROLLBACK命令。 如果在设置了OFF日记模式时应用程序在事务中间崩溃,则数据库文件很可能会损坏。

听起来你走在正确的轨道上,但其他一个选择会更安全。

答案 2 :(得分:3)

您是否在数据库文件旁边有.db-journal文件?如果是这样,请确保您的应用程序可以从数据库所在的文件夹中删除文件。

您的症状表明SQLite可以读写,但无法删除日志文件。

答案 3 :(得分:2)

另一种可能性是使用以下SQL语句

"PRAGMA journal_mode = TRUNCATE"

它仍保留日志,因此如果在事务期间断电,您仍然可以回滚,并且您将避免数据库损坏。 DELETETRUNCATE之间的区别在于删除会为每个语句不断创建和删除日志文件。 截断只需要创建一次并覆盖它。在我的情况下,它更快,我避免了标准journal_mode = DELETE带来的奇怪权限。

请参阅SQlite3 Pragma_journal_mode explenation