我的 ASP.NET MVC (.Net Framework 4.7.2) Web 应用程序使用 Microsoft.Data.Sqlite 5.0.2 崩溃(在调试 IIS Express 中,以及 Windows 10 中本地 IIS 上的 app.publish 中),位于以下行:
SqliteConnection dbConn = new SqliteConnection("Data Source=test.db");
抛出异常:
System.TypeInitializationException
HResult=0x80131534
Message=The type initializer for 'Microsoft.Data.Sqlite.SqliteConnection' threw an exception.
Source=Microsoft.Data.Sqlite
StackTrace:
at Microsoft.Data.Sqlite.SqliteConnection..ctor(String connectionString)
at sqliteTest.Controllers.ValuesController.Get() in C:\Users\FaqeerHussain\source\repos\sqliteTest\sqliteTest\Controllers\ValuesController.cs:line 16
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass6_2.<GetExecutor>b__2(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
This exception was originally thrown at this call stack:
[External Code]
Inner Exception 1:
TargetInvocationException: Exception has been thrown by the target of an invocation.
Inner Exception 2:
Exception: Library e_sqlite3 not found
e_sqlite3.dll 已经在
bin\runtimes\win-x64\native
和 bin\runtimes\win-x86\native
中。尝试将 x86/x64 e_sqlite3.dll 复制到根 bin
文件夹,但错误仍然存在。我应该怎么做才能让 Microsoft.Data.Sqlite 正常工作?
我发现e_sqlite3.dll位于runtimes\win-x86 原生_sqlite3.dll。 因此,我创建了这些文件夹并将 e_sqlite3.dll 添加到本机文件夹中。之后就成功了!
抛弃
Microsoft.Data.Sqlite
,转而支持System.Data.Sqlite
。它支持 3.38 版数据库,并具有更新插入和其他优点,并且不存在此类问题。我做到了,再也没有回头。
区别在于名称的大小写:
using System.Data.SQLite;
代替:
SqliteConnectionStringBuilder
SqliteConnection
SqliteCommand
SqliteTransaction
SqliteType.Text
您将分别使用:
SQLiteConnectionStringBuilder
SQLiteConnection
SQLiteCommand
SQLiteTransaction
DbType.String etc
这是一个已知问题尚未修复。
我引用了来自 .NET Framework 4.8 项目的使用 SQLite 的 .NET Standard 2.0 库。我将库更改为也以 .NET 4.8 为目标作为解决方法,因为 .NET 的任何其他实现都没有使用它。我必须在我的 SQLite 项目中将
<TargetFramework>netstandard2.0</TargetFramework>
更改为 <TargetFramework>net48</TargetFramework>
。
我认为这里的问题是
Microsoft.Data.Sqlite
依赖于SQLitePCLRaw.bundle_e_sqlite3
,SQLitePCLRaw.bundle_e_sqlite3
依赖于SQLitePCLRaw.lib.e_sqlite3
,其中SQLitePCLRaw.lib.e_sqlite3
没有实际的DLL,因为它直接提供本机二进制文件。因此,当我遇到这个问题时,我发现安装后我的 SQLitePCLRaw.lib.e_sqlite3
中不存在 csproj
NuGet 及其构建目标。因此,当项目由 VS 或 MSBuild 构建时,他们都不知道在构建过程中必须将 e_sqlite3
本机二进制文件复制到 bin
文件夹中。
我确实通过手动将目标添加到
csproj
中解决了这个问题:
<Project>
...
<Import Project="..\..\packages\SQLitePCLRaw.lib.e_sqlite3.2.1.5\buildTransitive\net461\SQLitePCLRaw.lib.e_sqlite3.targets" Condition="Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.2.1.5\buildTransitive\net461\SQLitePCLRaw.lib.e_sqlite3.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\..\packages\SQLitePCLRaw.lib.e_sqlite3.2.1.5\buildTransitive\net461\SQLitePCLRaw.lib.e_sqlite3.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\SQLitePCLRaw.lib.e_sqlite3.2.1.5\buildTransitive\net461\SQLitePCLRaw.lib.e_sqlite3.targets'))" />
</Target>
...
</Project>
对于
Maui
多平台应用程序,请确保您的项目文件中有以下内容(更新到实际版本):
<ItemGroup>
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.2" />
</ItemGroup>
<ItemGroup>
<None Remove="SQLitePCLRaw.bundle_e_sqlite3" />
</ItemGroup>
我使用 Microsoft.Data.Sqlite 5.0.10 的 ASP.NET (.Net Framework 4.7) Web 应用程序给出:
异常:找不到库 e_sqlite3
我删除了 Microsoft.Data.Sqlite 的依赖库并 Microsoft.Data.Sqlite.Core、SQLitePCLRaw.bundle_e_sqlite3、SQLitePCLRaw.core、 SQLitePCLRaw.lib.e_sqlite3、SQLitePCLRaw.provider.dynamic_cdecl 等,来自包文件夹。我添加了 Microsoft.Data.Sqlite 版本 6.0.0 及其依赖项。我的应用程序现在可以运行了。我只用这个库来读取 SpatiaLite 数据库。
使用 Microsoft.Data.Sqlite 5.0.0 的 .NET Framework 4.7.2 测试库的 NUnit 2 GUI 中出现此错误。找到了 xUnit 解决方案here,即禁用卷影复制。
我不得不返回到用于我的旧项目(4.7.2 及之前)的 Microsoft.Data.Sqlite 版本到 1.0.0。我确实检查过:平台子文件夹和 DLL 都在那里。
这个问题在所有最新版本中仍然存在!我不敢相信,在问题首次报告 5 年后,这种情况仍然在发生。
我在它工作之前摆弄了很长时间。最终找到了简单的解决方案。
为 AnyCPU 构建项目
将 e_sqlite3.dll 从release\x86文件夹复制到与主可执行文件相同的文件夹
应用程序然后运行,没有错误。
如果您使用 NuGet 下载了 Microsoft.Data.Sqlite:使用该目录 \Users"用户名".nuget\packages\sqlitepclraw.lib.e_sqlite3"版本" untimes\win-x64 原生_sqlite3.dll 其中“Version”不是e_sqlite3.dll版本,而是Microsoft.Data.Sqlite 对于 e_sqlite3.dll 版本,执行 cmd.CommandText = "select sqlite_version();"
我有一个类似的问题,它是由
packages.config
和 PackageReference
混合引起的。 (我现在正在开发一些旧的遗留软件)我右键单击 packages.config
并选择 Migrate packages.config to PackageReference
,它修复了调用 SQLitePCL.Batteries.Init();
时无法找到 e_sqlite3.dll 的问题此外,我不再需要打电话给SQLitePCL.Batteries.Init();
,所以我删除了它。