C# SQLite:';无法打开数据库文件';具有多个命令的事务异常

C# SQLite:';无法打开数据库文件';具有多个命令的事务异常,c#,sqlite,system.data.sqlite,C#,Sqlite,System.data.sqlite,我有以下(简化)代码: 与: 除了最后一个,所有ExecuteOnQuery都可以正常工作。在我的机器(运行xp)上,我得到以下异常,但在其他机器(运行Windows7)上,它工作正常,代码和数据库文件相同 SQLiteException (0x80004005): Unable to open the database file System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt) +375 System.Data.SQLite.

我有以下(简化)代码:

与:

除了最后一个,所有ExecuteOnQuery都可以正常工作。在我的机器(运行xp)上,我得到以下异常,但在其他机器(运行Windows7)上,它工作正常,代码和数据库文件相同

SQLiteException (0x80004005): Unable to open the database file
  System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt) +375
  System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt) +199
  System.Data.SQLite.SQLiteDataReader.NextResult() +226
  System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave) +87
  System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior) +38
  System.Data.SQLite.SQLiteCommand.ExecuteNonQuery() +39
我尝试在连接字符串中使用JournalMode=Perist,并从防病毒软件中排除了包含数据库文件的目录,但没有任何帮助

我使用的是3.5框架,System.Data.SQLite的版本是1.0.66.0

有什么想法吗

提前感谢,


Marc

我从Robert Simpson编写的版本1.0.66.0升级了我的System.Data.SQLite.dll(http://sqlite.phxsoftware.com)到SQLite开发团队编写的版本1.0.74.0(http://system.data.sqlite.org)这似乎解决了问题。

我在1.0.87和1.0.89中遇到了同样的问题,最终(在procmon的帮助下)找出了原因。这实际上是一条误导性的错误消息,因为它不是被拒绝访问的数据库文件本身,而是SQLite语句日志

虽然正在正确的位置创建SQLite数据库文件和日志,并且该文件夹上的权限允许所有人访问,但SQLite仍在对其语句日志使用
%TEMP%
%TEMP%
映射到运行该服务的身份的用户配置文件下的临时文件夹。因此,当客户端标识命中服务(并在服务内部和后面模拟),该非特权标识无法创建用于语句日志的
etilqs\uuuxxxxx
temp文件夹

我的解决方案是在
SQLiteConnection
s上设置
PRAGMA

PRAGMA temp_store_directory='<same_path_as_the_database_file>'
PRAGMA temp\u store\u目录=“”

我知道这个问题很老,但我昨天刚遇到同样的问题,正在寻找答案。在我的情况下,我的开发环境正常工作,生产失败。问题是我的生产web.config中的以下行:

<connectionStrings>
    <add name="SalesForceConnection"
        connectionString="metadata=res://SalesForceDataModel.csdl|res://SalesForceDataModel.ssdl|res://SalesForceDataModel.msl;
        provider=Devart.Data.Salesforce;
        provider connection string=&quot;
        User Id=myUserId;
        Password=myPassword;
        Security Token=myToken;
        Persist Security Info=True;
        Host=login.salesforce.com;
        Data Cache=c:\projects\salesforce\1.db;
        Metadata Cache=c:\projects\salesforce\1_Metadata.db&quot;"
        providerName="System.Data.EntityClient" />
</connectionStrings>


数据缓存和元数据缓存都指向我的开发环境中的目录。由于连接字符串很长,我错过了这两个设置。我将目录更改为生产服务器上的目录,所有这些都正常工作。

我忘了提到异常仅发生在asp.net web应用程序中。相同的代码(使用相同的数据库文件)在winforms中,应用程序工作正常。用于运行web应用程序的匿名用户可以访问数据库文件所在的目录。如果我在最后一个ExecuteOnQuery之前放置断点,我会看到日志文件已创建,并且匿名用户有权访问它。但是,当我继续时,仍然会发生此异常最后一个查询。是否SQLite使用工作线程,而IIS 5.1(winxp)使用IIS 6或更高版本以外的其他用户执行此线程?我尝试使用普通windows用户而不是匿名用户运行网站,但未发生异常。但正如我所说,匿名用户也可以完全访问数据库文件。很奇怪,这与版本有关。我对最新版本也有相同的操作n(1.0.82)。当我恢复到1.0.80时,一切都很好。运行1.0.87时,我似乎遇到了一个奇怪的类似问题。在我的情况下,数据库嵌入到WCF服务中。当从运行在同一台机器上的客户端访问服务时-没有问题。当通过NETTCP从单独的客户端机器访问服务时,transac中的最终查询tion在SQLite3.Reset()中给出了相同的错误。db文件位于服务标识可以完全控制的位置。
PRAGMA temp_store_directory='<same_path_as_the_database_file>'
<connectionStrings>
    <add name="SalesForceConnection"
        connectionString="metadata=res://SalesForceDataModel.csdl|res://SalesForceDataModel.ssdl|res://SalesForceDataModel.msl;
        provider=Devart.Data.Salesforce;
        provider connection string=&quot;
        User Id=myUserId;
        Password=myPassword;
        Security Token=myToken;
        Persist Security Info=True;
        Host=login.salesforce.com;
        Data Cache=c:\projects\salesforce\1.db;
        Metadata Cache=c:\projects\salesforce\1_Metadata.db&quot;"
        providerName="System.Data.EntityClient" />
</connectionStrings>