如何从 Windows 10 UWP 应用程序连接到 SQL Server 数据库

Posted

技术标签:

【中文标题】如何从 Windows 10 UWP 应用程序连接到 SQL Server 数据库【英文标题】:How to connect to SQL server database from a Windows 10 UWP app 【发布时间】:2015-12-29 09:34:16 【问题描述】:

我正在尝试从通用 Windows 应用程序连接到本地 MS SQL 数据库。我正在使用 UWP 制作一个 LOB 应用程序,以支持台式机、平板电脑和移动设备的使用。在尝试连接到本地(内网)SQL Server 数据库时,我习惯于使用SqlConnection 的实例连接到本地服务器,但由于 SqlConnection 不包含在 UWP 中使用的 .NET 子集中,如何这是在使用 UWP 时完成的吗?

我查看了official Microsoft samples 和how-to guides,并没有发现任何关于不是Azure 数据库的数据库连接。 DbConnection 似乎是一个不错的选择,但由于它是抽象的,因此不能使用,而且它的子项(例如 Data.SqlClient.SqlConnection)似乎不包含在 UWP 的 .NET 子集中。

我在这里遗漏了一些非常明显的东西吗?顺便说一句,有人知道 UWP 的良好命名空间参考吗?

编辑非重复:建议作为重复的链接问题适用于 Windows 8/8.1 应用程序,虽然有一些相似之处,但该问题的已接受答案中的代码不适用于 UWP。不过原理是一样的,不过应该有更好的技术参考来介绍使用 UWP 构建的 Windows 10 应用。

【问题讨论】:

我认为您至少现在需要考虑使用 Web 服务来使您的 UWP 应用程序和数据库连接起来。但我认为您可以继续检查当前处于预发布版本的 EF 7。 github.com/aspnet/EntityFramework 感谢您的快速评论!我正在尝试找到这方面的示例,但结果不足。是否有任何官方文档或任何教程?我以前没有使用过网络服务,所以一个包含更多细节的答案会得到我的支持和接受:) How do I interact with SQL in a Windows Store App的可能重复 【参考方案1】:

借助 Windows 10 Fall Creators Update(内部版本 16299),UWP 应用现在可以通过标准 NET 类 (System.Data.SqlClient) 直接访问 SQL Server - 这要归功于 UWP 中新添加的对 .NET Standard 2.0 的支持。

这是一个 Northwind UWP 演示应用: https://github.com/StefanWickDev/IgniteDemos

我们在 2017 年 9 月的 Microsoft Ignite 上展示了这个演示,这是我们的会议记录(SQL 演示跳到 23:00): https://myignite.microsoft.com/sessions/53541

这是从 Northwind 数据库中检索产品的代码(参见演示中的 DataHelper.cs)。请注意,这与您为 Winforms 或 WPF 应用程序编写的代码完全相同 - 感谢 .NET Standard 2.0:

public static ProductList GetProducts(string connectionString)

    const string GetProductsQuery = "select ProductID, ProductName, QuantityPerUnit," +
        " UnitPrice, UnitsInStock, Products.CategoryID " +
        " from Products inner join Categories on Products.CategoryID = Categories.CategoryID " +
        " where Discontinued = 0";

    var products = new ProductList();
    try
    
        using (SqlConnection conn = new SqlConnection(connectionString))
        
            conn.Open();
            if (conn.State == System.Data.ConnectionState.Open)
            
                using (SqlCommand cmd = conn.CreateCommand())
                
                    cmd.CommandText = GetProductsQuery;
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    
                        while (reader.Read())
                        
                            var product = new Product();
                            product.ProductID = reader.GetInt32(0);
                            product.ProductName = reader.GetString(1);
                            product.QuantityPerUnit = reader.GetString(2);
                            product.UnitPrice = reader.GetDecimal(3);
                            product.UnitsInStock = reader.GetInt16(4);
                            product.CategoryId = reader.GetInt32(5);
                            products.Add(product);
                        
                    
                
            
        
        return products;
    
    catch (Exception eSql)
    
        Debug.WriteLine("Exception: " + eSql.Message);
    
    return null;

如果您需要支持比 Fall Creators Update 更早的版本,您还可以通过桌面桥从 UWP 应用程序包调用 SqlClient API。我在这里发布了一个示例: https://github.com/Microsoft/DesktopBridgeToUWP-Samples/tree/master/Samples/SQLServer

【讨论】:

秋季创作者更新中的新支持不需要任何桌面桥,并且适用于所有目标设备。此外,构建仅针对桌面(或仅针对 IoT 等)的 UWP 应用程序是完全有效且受支持的方案。这就是平台在清单中有 TargetDeviceFamily 属性的原因,也是我们有特定于设备的扩展 SDK(用于桌面、物联网等)的原因。开发人员可以灵活地决定他们想要定位什么,我们不强制要求定位所有设备。坦率地说,对于 LOB 场景,大多数客户希望主要针对台式计算机。 直言不讳 :) 感谢更新!接受这个作为正确答案,因为这似乎是官方的做法。 我的答案中的第一个链接已经指向了如何直接从 UWP 应用程序使用 .NET Standard 2.0 连接到 SQL Server 的代码示例。缺少什么? 在答案中添加了相关的 sn-p。请注意,这与过去 15 年为 Winforms 编写的代码完全相同——这要归功于 .NET Standard 2.0。无需为此学习新概念。 很遗憾,没有手机更新到 16299 或更高版本,因此此功能不适用于 Windows 10 Mobile。【参考方案2】:

将 UWP 连接到 SQL Server

注意:从 windows 10 Fall Creators Update (16299) 我们可以使用 .NetStanded 2.0 直接访问 SQL Server 数据库

由于没有直接连接到 SQL Server 的方法,我们需要为我们的数据库创建一个 API 以连接到 SQL Server。

这个解决方案描述

    创建 API 序列化和反序列化 JSON 数据

1。创建 API

1) 安装 ASP.NET 和 Web 开发

    启动 Visual Studio 安装程序 并点击 修改

    安装 ASP.NET 和 Web 开发

2) 创建新的 ASP.NET Web 应用程序 (.Net Framework)

    在您的解决方案中添加新项目

    选择 ASP.NET Web Application (.Net Framework) 并给出项目名称

    选择 Web API 并点击确定

3) 连接 SQL Server 数据库

    在模型文件夹中添加新项目

    选择 ADO.NET 实体数据模型并为其命名

    从数据库中选择 EF 设计器,然后单击下一步

    点击新建连接

    配置您的连接,点击确定,然后点击下一步

    选择实体框架版本并点击下一步

    选择要连接的数据库和表并点击完成

4) 添加控制器与模型通信

    在继续之前重建您的项目

    在控制器文件夹中添加新控制器

    选择带有动作的 Web API 2 控制器,使用实体框架并点击添加

    从下拉列表框中选择模型类(表名)和数据上下文类(数据库名),然后单击添加

5) 测试 API

    将此项目设置为启动项目

    在网络浏览器中运行项目

    现在您的浏览器将打开一个本地主机站点。 点击 API 在顶部

    此页面显示您项目中可用的所有 API

    从下面复制任何 API 链接并将其替换为 URI 中的“帮助”,然后按 Enter。现在您应该能够从 SQL Server 数据库中看到您的数据了

2。序列化和反序列化 JSON 数据

1) 安装Newtonsoft.Json

2) 反序列化 JSON

HttpClient httpClient = new HttpClient();
var jsonReponse = await httpClient.GetStringAsync("http://localhost:xxxxx/api/LogIns");
logInResult = JsonConvert.DeserializeObject<List<LogIn>>(jsonReponse);

您可以从 Models 中获取模型类

只需在你的 UWP 项目中创建相同的类

3) 序列化 JSON

var logIn = new Models.LogIn()

    Username = "username",
    Password = "password"
;
var logInJson = JsonConvert.SerializeObject(logIn);

HttpClient httpClient = new HttpClient();
var httpContent = new StringContent(logInJson);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");

await httpClient.PostAsync("http://localhost:56267/api/LogIns", httpContent);

更多关于JSON Serialization And Deserialization Using JSON.NET Library In C#的信息

【讨论】:

【参考方案3】:

我也不得不走同样的路……期待 SQLServer 可以直接通过 EF Core 直接访问。

我看过上面的两个教程,由于我是新开发的,它只会让我胃口大开。然而,我确实在 YouTube 上找到了这个详细的 Video Tutorial,它会引导你通过;

创建 Web 服务 在 WebService 和 UWP 应用中创建重复的 POGO 类 为您要创建的每个表创建 Web API 2.0 实体框架控制器 通过 NuGet 将 Newtonsoft.JSON 和 Microsoft.Net.HTTP 添加到 UWP 应用中 最后通过代码隐藏中的 Web 服务/JSON 调用从 UWP 调用回本地 SQL Server。

尽管这个视频不是英文的,但我可以看到他在做什么,然后暂停并复制。

【讨论】:

【参考方案4】:

这是simple sample 和a video。不确定它是否适合你。

这里有个难点是

如何消费、序列化和反序列化 json 数据。作为 .net 开发人员,您可以考虑使用 HttpClient 来实现这一点。这里是another sample 和video 供您参考。还有another official sample展示了如何使用Windows.Data.Json命名空间。

【讨论】:

这至少是在正确的道路上。但正如我在编辑中所写的,大部分代码都是针对 8.1 的,不会为 UWP 构建。不过,这只是一个开始,如果一段时间内没有更好的表现,我会接受。 这让我走上了正轨,我会接受这个而不是写我自己的答案。感谢您的努力! 嗨,在 Entity Framework 7 的路线图中,它说它将支持 UWP。在 Database Providers 部分 - 表示支持 SQLServer、SQLLite 和 InMemory 开箱即用。因此,我们可以期待其他提供商很快支持 EF7,并且 UWP 将拥有直接的 DB 连接而不是 WebService 路径。 github.com/aspnet/EntityFramework/wiki/Roadmap Entity Framework 7 重命名为 Entity Framework Core 1.0

以上是关于如何从 Windows 10 UWP 应用程序连接到 SQL Server 数据库的主要内容,如果未能解决你的问题,请参考以下文章

通过 Windows 10 uwp 上的代码重新启动

如何更改 windows uwp图标

Windows 10 UWP 部署

在Windows 10 UWP WinJS应用程序中,如何确定构建中包含哪些文件?

从 UWP 应用程序看不到 localhost

如何在 Windows 10 上控制蓝牙 LE 连接?