在WinRT应用程序中使用SQLite时出现异常

时间:2013-10-03 13:44:53

标签: sqlite windows-runtime sqlite-net

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

我正在尝试在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的最新文档?
  3. 编辑:我用来创建数据库的代码是:

    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:有关我的设置的更多信息:

    • Visual Studio 2013 RC
    • Windows 8.1 RTM
    • SQLite for Windows Runtime 3.8.0.2
    • sqlite-net 1.0.7

1 个答案:

答案 0 :(得分:8)

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

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

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


更新

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

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

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

add reference

但仍然像我在第一个回答中所说,你需要将你的构建模式设置为“任何CPU”以外的其他模式

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


更新2

Db路径:

var dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "db.sqlite");
var db = new SQLite.SQLiteConnection(dbPath);