【问题标题】:Can't open/create .db file with SQLite in Visual Studio (UWP, C++)无法在 Visual Studio(UWP、C++)中使用 SQLite 打开/创建 .db 文件
【发布时间】:2016-09-19 12:27:21
【问题描述】:

我在 Visual Studio 2015 中创建了一个空白通用应用程序,并在 MainPage 中添加了一个按钮。然后,我为按钮创建了单击事件处理程序:myButton_Click(...)。我有以下代码:

void MyTestApp::MainPage::myButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    sqlite3 *testDB;
    int result = sqlite3_open("file:///C:/Users/MyName/Downloads/testDB.db", &testDB);
    myButton->Content = result.ToString();
}

如您所见,我只是尝试创建一个新的 db 文件,sqlite3_open() 函数的结果显示在按钮上。不幸的是,我总是收到Code 14: SQLITE_CANTOPEN

在 Visual Studio 中,我通过工具 -> 扩展和更新安装了“通用 Windows 平台的 SQLite”。在解决方案资源管理器下,我将 UWP 的 SQLite 添加到了参考中,还包括了 <sqlite3.h> 标头。

我是否必须为应用分配任何特殊权限才能创建文件或我做错了什么?

【问题讨论】:

    标签: visual-studio sqlite c++-cli uwp


    【解决方案1】:

    默认情况下,UWP 应用无法在自己的私有位置之外读取 - 请参阅 file access for UWP in MSDN

    您可以使用StorageFile API 访问私有存储区域之外的位置,但它们不适用于需要文件名的 SQLite。目前除了先将数据库复制到本地存储区域外,没有其他办法。

    【讨论】:

    • 谢谢。你的链接给了我一些我以前不知道的新信息。我现在使用链接中的InstalledLocation 获取了安装文件夹,并在我的VS 项目中获得了AppX 目录。我已将代码修改为int result = sqlite3_open("testDB.db", &testDB);,但我再次获得了代码14。我还尝试了完整的路径file:///C:/.../AppX/testDB.db,再次尝试了代码14。但是,在使用sqlite3_open("file:///C:/Users/MyName/AppData/Local/Packages/.../testDB.db", &testDB); 的AppData 位置下,我得到了SQLITE_OK。但是那里没有创建testDB.db 文件...
    • InstalledLocation 是只读的。使用ApplicationData.Current 获取本地文件夹。也不需要使用“file:///”语法。
    【解决方案2】:

    Peter Torr 的 cmets 终于奏效了:

    void MyTestApp::MainPage::myButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
        Windows::Storage::StorageFolder^ f = Windows::Storage::ApplicationData::Current->LocalFolder;
    
        sqlite3 *testDB;
        int result = sqlite3_open_v2("C:/Users/MyName/AppData/Local/Packages/538ec661-2ebf-4c45-8845-3a4cb6afd397_4jdacjwc0e74a/LocalState/testDB.db", &testDB, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
    
        //This works too:
        //int result = sqlite3_open_v2("C:\\Users\\MyName\\AppData\\Local\\Packages\\538ec661-2ebf-4c45-8845-3a4cb6afd397_4jdacjwc0e74a\\LocalState\\testDB.db", &testDB, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
    
        myButton->Content = result.ToString();
        //myButton->Content = f->Path;
    
        sqlite3_close(testDB);
    }
    

    testDB.db 现在可以在您在代码中看到的目录中找到。我之前尝试过类似的代码,但它不起作用。看来 SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE 的标志有所不同...

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 2018-06-11
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多