4

我正在构建一个 Windows 8 应用程序,现在我想为这个应用程序使用 SQLite。我SQLite for Windows Runtime通过 Visual Studio 2013 扩展管理器安装,并sqlite-net通过 NuGet 添加到我的项目中。

我正在尝试在我的 app.xaml.cs 中创建一个数据库OnLaunched,但是当我运行该项目时出现此异常:

无法加载 DLL 'sqlite3':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)

这很奇怪,因为编译时没有错误。无论如何,我认为它试图告诉我我需要引用一个额外的 DLL: sqlite3.dll,但这不起作用。我的文件系统上有 6 个不同的 DLL:ARM、x64 和 x86 的调试和发布版本。我尝试将 x86 发布版本添加到我的项目中,但这会导致此异常:

无法添加对“C:\Users\Leon\Documents\Visual Studio 2013\Projects\Googalytics\packages\SQLite\x86\sqlite3.dll”的引用。请确保该文件是可访问的,并且它是一个有效的程序集或 COM 组件。

非常遗憾的是 sqlite-net 的文档很烂,它非常过时(示例甚至不再起作用),它非常不完整,也没有提到手动添加 DLL。所以我有两个问题:

  1. 我该如何解决这个特定问题?
  2. 我在哪里可以找到 sqlite-net 的最新文档?

编辑:我用来创建数据库的代码是:

private void InitializeDatabase()
{
    var db = new SQLiteConnection("Googalytics");

    db.CreateTable<Account>();
    db.CreateTable<WebProperty>();
    db.CreateTable<Profile>();
}

我从这里调用该方法:

InitializeDatabase();

if (rootFrame.Content == null)
{
    // When the navigation stack isn't restored navigate to the first page,
    // configuring the new page by passing required information as a navigation
    // parameter
    if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
    {
        throw new Exception("Failed to create initial page");
    }
}
// Ensure the current window is active
Window.Current.Activate();

edit2:有关我的设置的更多信息:

  • 视觉工作室 2013 RC
  • 视窗 8.1 RTM
  • 适用于 Windows 运行时 3.8.0.2 的 SQLite
  • sqlite-net 1.0.7
4

1 回答 1

8

您的项目当前将其构建模式设置为任何 CPU,这是默认设置。因为 SqLite 程序集不是作为 AnyCPU 构建的,所以您需要将构建模式设置为 X86 并添加 X86 SqLite 引用。

部署您的应用程序时,您还需要创建 3 个包而不是 1 个 AnyCPU 包。

因为您的项目是 AnyCPU,所以在尝试添加 x86 时会收到错误消息,x86 对 AnyCPU 无效。


更新

我试图复制你的问题。我安装了SQLite for Windows RuntimeVisual Studio Ultimate 2012,之后我创建了一个 Windows Store 项目,然后添加了 SqLite 引用,sqlite-net最后我添加了用于创建数据库的代码。

我稍微修改了代码(路径和表格)。但是我的代码完全没有错误。

我不需要自己引用 SqlLite 程序集。因为通过将扩展安装到 Visual Studio 中,您可以在扩展列表中获得引用(仍然需要选择它,只是不要添加 dll):

添加参考

但仍然就像我在第一个答案中所说的那样,您需要将构建模式设置为“任何 CPU”以外的其他内容

我的示例在我的skydrive上(当测试集配置为 x86 时)。


更新 2

数据库路径:

var dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "db.sqlite");
var db = new SQLite.SQLiteConnection(dbPath);
于 2013-10-03T13:59:53.947 回答