【问题标题】:How to connect to SQL server from C++/WinRT UWP app?如何从 C++/WinRT UWP 应用程序连接到 SQL Server?
【发布时间】:2019-11-21 10:12:36
【问题描述】:

我正在尝试创建连接到 MySQL 数据库的 C++/WinRT UWP 应用程序,但实际上任何查询任何内容的方式都会很棒;我只需要以一种方便的方式存储和更新我的数据并通过 LAN 使用它。

了解 WinRT 我被重定向到 UWP 文档,在那里我找到了使用 System.Data.SQLite/SqlClient 或 MySQL.Data 的方法,但所有这些都返回:

您正在尝试将此包安装到以“native,Version=v0.0”为目标的项目中,但该包不包含任何与该框架兼容的程序集引用或内容文件。

表示不支持 WinRT(“本机”)。

我找到了“SQLite for Windows Runtime (Windows 8.1)”,但是当我尝试执行 install-Package SQLite.WinRT 时,我遇到了同样的错误。在 WinRT 中存储关系数据的首选方式是什么,或者我做错了什么?

【问题讨论】:

  • SQLite 包含在 Windows 10 SDK 中。使用 SQLite 是 #include <sqlite.h> 的问题。这为您提供了一个 C 接口。您可以按原样使用它,也可以使用您喜欢的 C++ 包装器。
  • 更正,应该是#include <winsqlite/winsqlite3.h>。有关在本质上接近 C++/WinRT 的 C++ 包装器,请参阅 Kenny Kerr 的 MSDN 文章 Using SQLite with Modern C++。 SQLite 与 Windows 应用商店应用程序兼容,包括 UWP 应用程序。
  • 关于您遇到的错误的注释:您正在尝试在本机应用程序中引用 .NET 程序集(System 命名空间是提示)。虽然您可以使用以 .NET 语言编写的 Windows 运行时组件,但您不能使用常规的 .NET 程序集。
  • @IInspectable 我正在尝试按照 Kenny 的描述使用此标头,但我收到有关使用的不同方法的链接器错误,例如“SQLiteConnection.obj:错误 LNK2001:无法解析的外部符号 _sqlite3_close@4”。谷歌搜索给了我关于我需要如何安装 nuget sqlite 包的主题,但是这个包给了我我首先描述的错误。
  • 我仍然没有在 UWP 应用程序中使用 SQLite 的实践经验。我计划下周将数据存储合并到我的一个宠物项目中。当我完成评估后,我会在这里给出答案。

标签: mysql sqlite uwp c++-winrt


【解决方案1】:

在过去的几周里,我一直在让 SQLite 在 C++/WinRT 应用程序中工作。 SQLite 是内置在 windows sdk 中的,但我没有很快发现这一点,而是走上了使用vcpkg 中提供的正式版本的道路,并由sqlite.org 发布。

我能够相当轻松地让库工作,但我无法掌握 C 接口的窍门。在 vcpkg 中也有一些很好的 C++ 包装器,所以我尝试了其中的 2 个并决定使用 sqlite_modern_cpp。它似乎并没有被积极开发,但它只是一个界面,并且与 3.28 版本的 sqlite 配合得很好。

要开始使用 sqlite 或 sqlite_modern_cpp,我使用基本相同的方法。

1.使用 vcpkg 安装其中一个

.\vcpkg.exe install sqlite-modern-cpp:x64-uwp

.\vcpkg.exe install sqlite3:x64-uwp

2。在 vcpkg 中启用用户范围的集成

.\vcpkg.exe integrate install

3.使用 C++/WinRT 空白应用模板创建新项目

4.更改为 x64 构建

5.更改为 x64 后,您应该可以将以下内容添加到 pch.h

#include "sqlite_modern_cpp.h"

#include "sqlite3.h"

6.现在您可以创建一个 sqlite db 并添加一个表

此示例使用 sqlite-modern-cpp 并被放入空白应用程序模板的点击处理程序中,只是为了有地方放置它。

void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
    myButton().Content(box_value(L"Clicked"));

    // path for the temporary database file
    hstring path{ ApplicationData::Current().LocalFolder().Path() + L"\\temp.db" };

    // store the file name for use later
    std::string fname = to_string(path.c_str());

    // open a connection to the database or create the file if it doesn't exist
    sqlite::database db(fname); // default is READWRITE | CREATE

    // enable foreign keys
    db << "PRAGMA foreign_keys = ON;";

    // create a new table, if needed
    db << "CREATE TABLE IF NOT EXISTS division ("
        "   id          INTEGER PRIMARY KEY AUTOINCREMENT,"
        "   name        TEXT    NOT NULL,"
        "   distance    INTEGER NOT NULL,"
        "   size        INTEGER NOT NULL,"
        "   lanes       INTEGER NOT NULL,"
        "   rank        INTEGER NOT NULL,"
        "   progression TEXT    NOT NULL,"
        "   UNIQUE (name, distance, size)"
        ");";
}

7.运行应用程序并单击按钮将生成 db。

使用上述方法,将在应用程序本地文件夹中创建文件。 C:\Users\\AppData\Local\Packages\\LocalState\temp.db

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多