Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 异常消息:发生某种磁盘I/O错误_Sqlite_Windows Xp_Io - Fatal编程技术网

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

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数据库运行更新查询时遇到此错误。这只发生在XP上(在Vista上工作正常)。数据库创建时没有任何问题,insert也可以正常工作。
我还检查了日志,并且我拥有可用的权限和磁盘空间(正如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同步,现在我正在向数据库写入大量数据,没有问题。谢谢