SQLite 尝试写只读数据库错误。

16

我有一个控制台应用程序,用于填充SQLite数据库。当应用程序单独运行时,我不会遇到任何错误。如果我运行多个应用程序实例,每个应用程序都在自己的文件夹中,并且每个应用程序填充自己的数据库,我偶尔会遇到以下异常:

System.Data.SQLite.SQLiteException (0x80004005): Attempt to write a read-only database
attempt to write a readonly database
   at System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt)
   at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
   at System.Data.SQLite.SQLiteDataReader.NextResult()
   at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
   at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()

我知道这个数据库不是只读的,因为它已经向该数据库写入了数据。此外,应用程序会继续向该数据库填充数据。当仅运行应用程序的一个实例时,我没有复制出错误。

我尝试使用pragma将日志和temp_store都存储在内存中而不是文件中,以防止应用程序之间可能存在的争用,但我仍然遇到了错误。我总是在同一个方法中得到错误,在该方法中第一次插入连接时发生错误。为了给出应用程序的概括性说明,它循环处理案例,收集有关这些案例的信息(不来自SQLite),然后将结果写入SQLite数据库。

我不知道还能尝试什么。

*编辑 我也在使用PRAGMA journal_mode=MEMORY。将数据插入SQLite数据库时,我首先运行BEGIN语句,然后运行一堆插入语句,最后运行END语句。错误发生在第一个插入操作上。


“我尝试使用编译指示(pragma)将日志和临时存储都存储在内存中,而不是存储到文件中,以防多个应用程序之间存在竞争关系。”事实上并不存在这种情况。您是如何打开数据库的?数据库所在的文件夹是否可写? - Colonel Thirty Two
1
是的,数据库所在的文件夹是可写的。大多数迭代都能正确地将数据插入到数据库中。我只是通过在SQLiteConnection周围使用using语句来打开数据库。 - UWSkeletor
2个回答

10

这是一个权限问题。

请确保您托管的Web应用程序对SQLite数据库所在的文件夹具有添加/写入/创建/删除访问权限。

更多详情请参阅此处


6
谢谢,但如果这是随机的,怎么可能是权限问题呢?该应用程序可以成功地写入数据库。只有在随机迭代中才会出现此错误。 - UWSkeletor
我同意@UWSkeletor的观点。还有什么需要补充的吗? - fralbo

1

可能是因为MigrationAssembly不支持该数据库文件。

当EF尝试迁移一个预期为SQLite数据库的文件,但实际上是文本文件时,也会抛出相同的异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接