除了IIS上的“无法打开数据库文件”之外,我似乎无法从SQLite中获取任何内容。我确信SQLite的错误消息和Oracle一样粗暴。
Full control
个App_Data和数据库文件的访问权限授予以下用户:IIS_IUSRS
,IUSRS
,DefaultAppPool
和Everyone
。< / LI>
我看过:
SQLite problem "unable to open the database file"(该问题会自动消失)以及其他一些类似的问题,其中大部分是通过更改权限,更改为可写目录(App_Data应该可写,没有?)或更改亲属来解决的。绝对路径(|DataDirectory|
应解决的路径)。
<connectionStrings>
<add name="sqlite" connectionString="Data Source=|DataDirectory|\datatables.sqlite;Version=3;" />
</connectionStrings>
我错过了什么吗?
<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>
答案 0 :(得分:4)
我们过去常常在客户的机器上遇到这个问题,我已经对它进行了大量的调查,最后我们已经解决了。
首先,您需要确保您的应用程序具有对数据库文件的读/写访问权限以及包含数据库文件的文件夹。在大多数情况下,检查将解决问题;但我们不是那些幸运的人之一。
在我们的例子中,应用程序对数据库进行非常高并发的访问,它很可能与数据库的日志模式有关,默认情况下通常是DELETE。也就是说,一旦提交或回滚相应的事务,就会删除回滚日志。在** nix系统上,它没有错误;但在Windows系统上,这是另一个故事,如下所示。在Windows系统上,问题可能发生在以下情形中:
一种解决方案是使用PERSIST或TRUNCATE日志模式而不是DELETE。有关详情,请参阅此处:http://www.sqlite.org/pragma.html#pragma_journal_mode
通过这种方式,回滚日志(。-journal)根本不会被删除,因此我们可以摆脱你说的问题。我希望这会有所帮助。
答案 1 :(得分:2)
我不知道这是否会回答你的问题,但在我的情况下,我有一个虚假的错误,当我将我的代码从命令行项目复制到mvc时,我给数据库文件提供了错误的相关URL一。希望有人会觉得这很有用。
答案 2 :(得分:1)
这不是权限问题。问题是我没有检查|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>
(奇怪的是,这isn't documented)。
答案 3 :(得分:1)
我在IIS中打开Sqlite数据库时遇到问题
(0x80004005):无法打开数据库文件无法打开数据库 文件
帮助我解决问题的是将应用程序池的“身份”更改为“LocalSystem”
应用程序池 - &gt; DefaultAppPool(或您正在使用的其他池) - &gt;高级设置 - &gt;身份 - &gt;本地系统
希望能节省时间......