2

除了 IIS 上的“无法打开数据库文件”之外,我似乎无法从 SQLite 中得到任何东西。我确信 SQLite 的错误信息和 Oracle 的一样粗暴。

  • 在 Visual Studio 2010/IIS Express 中预部署我可以读取和写入文件。
  • 当我尝试使用部署到 IIS7.5 的同一个 VS2010 项目读取/写入它时,所有“创建”、“读取”和“写入”命令都失败了。
  • 当我通过项目部署数据库文件并尝试读取它时,也会发生同样的情况。
  • 我已将Full controlApp_Data 和数据库文件的访问权限授予以下用户:IIS_IUSRSIUSRSDefaultAppPoolEveryone.

我看过: SQLite 问题“无法打开数据库文件”(该问题自动为用户消失)和许多其他类似问题,其中大部分通过更改权限解决,更改为可写目录(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

4 回答 4

5

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

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

帮助我解决问题的是将应用程序池的“身份”更改为“本地系统”

应用程序池 -> DefaultAppPool(或您正在使用的其他池)-> 高级设置 -> 身份 -> LocalSystem

希望它会节省一些人的时间......

于 2013-11-06T15:33:03.310 回答
4

我们以前在客户的机器上经常遇到这个问题,我对此做了很多调查,最后我们解决了。

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

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

  1. 日志文件(比如 A)由 SQLite 线程创建。
  2. 另一个线程 P 试图打开 A。
  3. SQLite 已完成其事务,因此删除了日志文件 A。
  4. 但是现在线程 P 有了 A 的句柄,所以 SQLite 进入了“Delete Pending”状态。
  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被删除。

一种解决方案是使用 PERSIST 或 TRUNCATE 日志模式而不是 DELETE。有关详细信息,请参见此处:http ://www.sqlite.org/pragma.html#pragma_journal_mode

这样回滚日志(.-journal)就完全没有被删除,就可以解决你说的问题了。我希望这有帮助。

于 2013-07-22T05:56:08.180 回答
2

好吧,我不知道这是否会回答您的问题,但就我而言,我遇到了一个虚拟错误,即当我将代码从命令行项目复制到 mvc 时,我给数据库文件提供了错误的 relatif URL。希望有人会发现这很有用。

于 2013-05-17T11:38:30.893 回答
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>

(奇怪的是,这没有记录在案)。

于 2013-09-08T17:27:10.347 回答