Sqlite 异常消息:发生某种磁盘I/O错误
我在尝试对SQLite数据库运行更新查询时遇到此错误。这只发生在XP上(在Vista上工作正常)。数据库创建时没有任何问题,insert也可以正常工作。Sqlite 异常消息:发生某种磁盘I/O错误,sqlite,windows-xp,io,Sqlite,Windows Xp,Io,我在尝试对SQLite数据库运行更新查询时遇到此错误。这只发生在XP上(在Vista上工作正常)。数据库创建时没有任何问题,insert也可以正常工作。 我还检查了日志,并且我拥有可用的权限和磁盘空间(正如sqlite.org所说,这些都是可能的原因)。一个对我有效的答案是使用该语句将日志模式值设置为“DELETE”以外的值。您可以通过发出PRAGMA语句来执行此操作,如PRAGMA journal\u mode=OFF,与发出查询语句的方式相同。我用c#at发布了一个例子: 编辑 也许发布一个
我还检查了日志,并且我拥有可用的权限和磁盘空间(正如sqlite.org所说,这些都是可能的原因)。一个对我有效的答案是使用该语句将日志模式值设置为“DELETE”以外的值。您可以通过发出PRAGMA语句来执行此操作,如
PRAGMA journal\u mode=OFF
,与发出查询语句的方式相同。我用c#at发布了一个例子:
编辑
也许发布一个更好的PRAGMA声明是PRAGMA journal\u mode=TRUNCATE
,而不是像其他两个建议的那样“OFF”。Per(强调我的):
关闭日志模式完全禁用回滚日志。从来没有创建过回滚日志,因此从来没有要删除的回滚日志。关闭日志模式禁用SQLite的原子提交和回滚功能。回滚命令不再工作;它以未定义的方式运行。当日志模式关闭时,应用程序必须避免使用ROLLBACK命令<强>如果应用程序在设置非日志模式时在事务的中间崩溃,那么数据库文件很可能会损坏。强>
听起来您的思路是正确的,但是其他选项之一会更安全。数据库文件旁边有.db日志文件吗?如果是这样,请确保应用程序可以从数据库所在的文件夹中删除文件
您的症状表明SQLite可以读写,但无法删除日志文件。另一种可能是使用以下SQL语句
"PRAGMA journal_mode = TRUNCATE"
它仍然保留日志,因此,如果事务期间电源出现故障,您仍然可以回滚,从而避免数据库损坏。DELETE
和TRUNCATE
之间的区别在于DELETE不断地为每条语句创建和删除日志文件。
Truncate只需要创建一次,然后将其覆盖。在我的例子中,这要快得多,我避免了标准journal\u mode=DELETE
附带的奇怪权限
请参阅这看起来像是我所寻找的完美解决方案,但事实证明,尝试执行此PRAGMA会引发相同的异常:我想这其实是我的问题。。。在WSL下的Windows 10上,dropbox中有一个文件夹,我认为Windows实际上是在阻止SQLite访问它自己的日志,因为dropbox已经打开它进行同步!这正是我的处境。我暂停了Dropbox同步,现在我正在向数据库写入大量数据,没有问题。谢谢