如何从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。
该解决方案描述
- 创建API
- 序列化和反序列化JSON数据
1.创建API
1)安装ASP.NET和Web开发
-
启动Visual Studio Installer ,然后单击“ 修改”
-
安装ASP.NET和Web开发
2)创建新的ASP.NET Web应用程序(.Net Framework)
-
在解决方案中添加新项目
-
选择ASP.NET Web应用程序(.Net Framework)并提供项目名称
-
选择Web API ,然后单击“确定”
3)连接到SQL Server数据库
-
在Models文件夹中添加新项目
-
选择ADO.NET实体数据模型并为其命名
-
从数据库中选择EF Designer,然后单击Next
-
单击“ 新连接”
-
配置连接 ,单击“确定”并单击“下一步”
-
选择Entity Framework version并单击next
-
选择要连接的数据库和表 ,然后单击“完成”
4)添加控制器以与模型通信
-
在继续之前重建您的项目
-
在Controllers文件夹中添加新的Controller
-
使用Entity Framework选择带有操作的Web API 2 Controller,然后单击“添加”
-
从下拉列表框中选择Model类 (表名)和Data context class (数据库名),然后单击Add
5)测试API
-
将此项目设置为启动项目
-
在Web浏览器中运行该项目
-
现在您的浏览器将打开一个localhost站点。 点击顶部的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>(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序列化和反序列化的更多信息