Asp.net mvc &引用;无法打开数据库文件";(警告:大范围错误)

Asp.net mvc &引用;无法打开数据库文件";(警告:大范围错误),asp.net-mvc,sqlite,asp.net-mvc-4,iis-7.5,system.data.sqlite,Asp.net Mvc,Sqlite,Asp.net Mvc 4,Iis 7.5,System.data.sqlite,除了IIS上的“无法打开数据库文件”之外,我似乎无法从SQLite中获得任何信息。我确信SQLite的错误消息和Oracle的一样直截了当 在Visual Studio 2010/IIS Express中进行预部署时,我可以读取和写入该文件 当我尝试使用部署到IIS7.5的相同VS2010项目读/写它时,所有“创建”、“读取”和“写入”命令都失败 当我通过项目部署数据库文件并尝试读取它时,也会发生同样的情况 我已将对应用程序数据和数据库文件的访问权限授予以下用户:IIS\u IUSRS、IUS

除了IIS上的“无法打开数据库文件”之外,我似乎无法从SQLite中获得任何信息。我确信SQLite的错误消息和Oracle的一样直截了当

  • 在Visual Studio 2010/IIS Express中进行预部署时,我可以读取和写入该文件
  • 当我尝试使用部署到IIS7.5的相同VS2010项目读/写它时,所有“创建”、“读取”和“写入”命令都失败
  • 当我通过项目部署数据库文件并尝试读取它时,也会发生同样的情况
  • 我已将对应用程序数据和数据库文件的访问权限授予以下用户:
    IIS\u IUSRS
    IUSRS
    DefaultAppPool
    所有人
我看过: (对于用户来说,这个问题会自动消失)和许多其他类似的问题,其中大多数问题都是通过更改权限、更改为可写目录(应用程序数据应该是可写的,否?)或将相对路径更改为绝对路径(应该解析为哪个路径)来解决的


我错过什么了吗

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>Unable to open the database file</ExceptionMessage>
<ExceptionType>System.Data.SQLite.SQLiteException</ExceptionType>
<StackTrace>
at System.Data.SQLite.SQLite3.Open(String strFilename, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, Int32 maxPoolSize, Boolean usePool) at System.Data.SQLite.SQLiteConnection.Open() at AjaxSource.Models.Database.query(String sql, Dictionary`2 parameters) in D:\Tools\Dropbox\Projects\myprojects\AjaxSource\AjaxSource\Models\Database.cs:line 48 at AjaxSource.Models.aaDataModel..ctor() in D:\Tools\Dropbox\Projects\myprojects\AjaxSource\AjaxSource\Models\aaDataModel.cs:line 18 at AjaxSource.Controllers.API.TableDataController.Get() in D:\Tools\Dropbox\Projects\myprojects\AjaxSource\AjaxSource\Controllers\API\TableDataController.cs:line 15 at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)
</StackTrace>
</Error>

发生了一个错误。
无法打开数据库文件
System.Data.SQLite.SQLiteException
在System.Data.SQLite.SQLite3.Open(字符串strFilename、SQLiteConnectionFlags connectionFlags、SQLiteOpenFlagsEnum openFlags、Int32 maxPoolSize、Boolean usePool)在System.Data.SQLite.SQLiteConnection.Open()在AjaxSource.Models.Database.query(字符串sql、字典`2参数)D:\Tools\Dropbox\Projects\myprojects\AjaxSource\AjaxSource\Models\Database.cs:AjaxSource.Models.aaDataModel..ctor()中的第48行,D:\Tools\Dropbox\Projects\myprojects\AjaxSource\Models\aaDataModel.cs:AjaxSource.Controllers.API.TableDataController.Get()中的第18行在D:\Tools\Dropbox\Projects\myprojects\AjaxSource\AjaxSource\Controllers\API\TableDataController.cs:System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c_uuDisplayClass13.b_uC(对象实例,对象[]方法参数)的lambda_方法(闭包,对象,对象[]方法参数)的第15行在System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 Func,CancellationToken CancellationToken)的System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象实例,对象[]参数)

我不知道这是否能回答你的问题,但在我的例子中,我有一个虚拟错误,那就是当我将代码从命令行项目复制到mvc项目时,我给了数据库文件一个错误的relatif URL。希望有人会觉得这很有用。

我们过去经常在客户的机器上遇到这个问题,我对此进行了大量调查,最终我们解决了这个问题

首先,您需要确保应用程序对数据库文件以及包含数据库文件的文件夹具有读/写访问权限。在大多数情况下,检查将解决问题;但我们并不属于那些幸运的人

在我们的例子中,当应用程序对数据库进行高度并发访问时,它很可能与数据库的日志模式有关,默认情况下,日志模式通常是DELETE。也就是说,一旦提交或回滚了相应的事务,回滚日志就会被删除。在**nix系统上,没有错误;但在Windows系统上,这是另一回事,如下所示。在Windows系统上,问题可能发生在以下情况:

  • 日志文件(比如A)是由SQLite线程创建的
  • 另一个线程P试图打开A
  • SQLite已完成其事务,因此删除日志文件A
  • 但是现在线程P有了A的句柄,所以SQLite进入“Delete Pending”状态
  • SQLite启动另一个事务,并且必须重新创建日志文件(使用相同的名称)
  • Windows报告错误\u删除\u挂起错误(有关详细信息,请参阅此处:)
  • SQLite报告SQLite_CANTOPEN错误(即“无法打开数据库文件”)
  • P最终释放文件句柄并删除A
  • 一种解决方案是使用持久或截断日志模式,而不是删除。有关更多详细信息,请参见此处:


    这样,回滚日志(.-journal)就不会被删除,因此我们可以解决您所说的问题。我希望这有帮助。

    这不是权限问题。问题是,我没有检查
    |DataDirectory |
    是否实际解析为AppData目录

    在IIS 7.5服务器上,
    |DataDirectory |
    解析为
    C:\inetpub\wwwroot\AjaxSource\App_Data
    ,但实际的AppData是目录
    C:\inetpub\wwwroot\AjaxSource\bin\App_Data

    我在使用Fiddler时发现的错误从未提及任何路径,而是暗示了权限问题。我让我的一个视图显示已解析的目录,其中包含:

    <h1>@AppDomain.CurrentDomain.GetData("DataDirectory")</h1>
    
    @AppDomain.CurrentDomain.GetData(“数据目录”)
    

    (奇怪的是,这个)。

    我在IIS中打开Sqlite数据库时遇到问题

    (0x80004005):无法打开数据库文件无法打开数据库 文件

    帮助我解决这个问题的是将应用程序池的“标识”更改为“LocalSystem”

    应用程序池->DefaultAppPool(或您正在使用的其他池)->高级设置->标识->本地系统

    希望它能节省某人的时间

    <h1>@AppDomain.CurrentDomain.GetData("DataDirectory")</h1>