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

我正在尝试从通用Windows应用程序连接到本地MS SQL数据库。 我正在使用UWP制作LOB应用程序,以支持桌面,平板电脑和移动应用。 当尝试连接到本地(Intranet)SQL Server数据库时,我习惯使用SqlConnection实例连接到本地服务器,但由于SqlConnection不包含在UWP中使用的.NET子集中,如何完成什么时候使用UWP?

我查看了官方的Microsoft示例以及操作指南 ,并且没有发现任何关于不是Azure数据库的数据库连接。 DbConnection似乎是一个很好的方法,但不能使用,因为它是抽象的,它的子项(例如Data.SqlClient.SqlConnection )似乎不包含在UWP的.NET子集中。

我错过了一些非常明显的东西吗? 另外,有没有人知道UWP的良好命名空间参考?

编辑非重复:建议作为重复的链接问题适用于Windows 8 / 8.1应用程序,虽然有一些相似之处,但该问题的已接受答案中的代码将无法在UWP上运行。 但原则是相同的,但对于使用UWP构建的Windows 10应用程序应该有更好的技术参考。

借助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

这是一个简单的示例和video 。 不确定它是否足够你。

这是一个难点

  • 如何使用,序列化和反序列化json数据。 作为.net开发人员,您可以考虑使用HttpClient来实现它。 这是另一个示例和video供您参考。 还有另一个官方示例显示了如何使用Windows.Data.Json命名空间。

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

我已经看过上面的两个教程,因为我刚开发,它只会影响我的胃口。 然而,我确实在YouTube上找到了这个详细的video教程 ,引导您走过;

  • 创建WebService
  • 在WebService和UWP App中创建重复的POGO类
  • 为要创建的每个表创建Web API 2.0entity framework控制器
  • 通过NuGet将Newtonsoft.JSON和Microsoft.Net.HTTP添加到您的UWP应用程序
  • 最后通过Code Behind中的Web Service / JSON调用从UWP调用回本地SQL Server。

尽管这个video不是英文的,但我能够看到他在做什么然后暂停和复制。

将UWP连接到SQL Server

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

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

该解决方案描述

  1. 创建API
  2. 序列化和反序列化JSON数据

1.创建API

1)安装ASP.NET和Web开发

  1. 启动Visual Studio Installer ,然后单击“ 修改” 在此处输入图像描述

  2. 安装ASP.NET和Web开发 在此处输入图像描述

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

  1. 在解决方案中添加新项目 在此处输入图像描述

  2. 选择ASP.NET Web应用程序(.Net Framework)并提供项目名称 在此处输入图像描述

  3. 选择Web API ,然后单击“确定” 在此处输入图像描述

3)连接到SQL Server数据库

  1. 在Models文件夹中添加新项目 在此处输入图像描述

  2. 选择ADO.NET实体数据模型并为其命名 在此处输入图像描述

  3. 从数据库中选择EF Designer,然后单击Next 在此处输入图像描述

  4. 单击“ 新连接” 在此处输入图像描述

  5. 配置连接 ,单击“确定”并单击“下一步” 在此处输入图像描述

  6. 选择Entity Framework version并单击next 在此处输入图像描述

  7. 选择要连接的数据库和表 ,然后单击“完成” 在此处输入图像描述

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

  1. 在继续之前重建您的项目 在此处输入图像描述

  2. 在Controllers文件夹中添加新的Controller 在此处输入图像描述

  3. 使用Entity Framework选择带有操作的Web API 2 Controller,然后单击“添加” 在此处输入图像描述

  4. 从下拉列表框中选择Model类 (表名)和Data context class (数据库名),然后单击Add 在此处输入图像描述

5)测试API

  1. 将此项目设置为启动项目 在此处输入图像描述

  2. 在Web浏览器中运行该项目 在此处输入图像描述

  3. 现在您的浏览器将打开一个localhost站点。 点击顶部的API 在此处输入图像描述

  4. 此页面显示项目中可用的所有API 在此处输入图像描述

  5. 从下面复制任何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>(jsonReponse); 

您可以从模型中获取模型类 在此处输入图像描述

只需在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); 

有关在C#中使用JSON.NET库进行JSON序列化和反序列化的更多信息