“无法打开数据库文件”(警告:广错误)

时间:2012-12-14 07:16:28

标签: 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项目读取/写入时,所有“创建”,“读取”和“写入”命令都会失败。
  • 当我通过项目部署数据库文件并尝试阅读它时,会发生同样的情况。
  • 我已将Full control个App_Data和数据库文件的访问权限授予以下用户:IIS_IUSRSIUSRSDefaultAppPoolEveryone。< / 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>

4 个答案:

答案 0 :(得分:4)

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

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

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

  1. 日志文件(比如A)由SQLite线程创建。
  2. 另一个帖子P试图打开A。
  3. SQLite已完成其事务,因此删除了日志文件A.
  4. 但是现在线程P有A的句柄,所以SQLite进入“删除待定”状态。
  5. SQLite启动另一个事务,并且必须重新创建日志文件(具有相同的名称)。
  6. Windows报告ERROR_DELETE_PENDING错误(有关详细信息,请参阅此处:http://blogs.msdn.com/b/oldnewthing/archive/2007/11/09/6001644.aspx
  7. SQLite报告SQLITE_CANTOPEN错误(即“无法打开数据库文件”)。
  8. P最终释放文件句柄,A被删除。
  9. 一种解决方案是使用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;本地系统

希望能节省时间......