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

时间:2015-10-01 10:52:04

标签: c# sql-server uwp windows-10 win-universal-app

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

我查看了official Microsoft samples以及how-to guides,但没有发现任何与Azure数据库不同的数据库连接。 DbConnection似乎是一种很好的方式,但不能使用,因为它是抽象的,它的孩子(例如Data.SqlClient.SqlConnection)不会似乎包含在UWP的.NET子集中。

我错过了一些非常明显的东西吗?顺便说一句,是否有人知道UWP的良好命名空间参考?

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

4 个答案:

答案 0 :(得分:10)

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

这是一个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

答案 1 :(得分:4)

这是simple samplea video。不确定它对你来说是否足够。

这是一个难点

  • 如何使用,序列化和反序列化json数据。作为.net开发人员,您可以考虑使用HttpClient来实现它。这里有another samplevideo供您参考。 another official sample显示了如何使用Windows.Data.Json命名空间。

答案 2 :(得分:2)

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

我已经看过上面的两个教程,因为我是新手,所以只会影响我的胃口。但是,我确实在YouTube上找到了这个详细的Video Tutorial,它可以引导您通过;

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

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

答案 3 :(得分:1)

将UWP连接到SQL Server

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

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

此解决方案描述

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

    1)安装ASP.NET和Web开发

    1. 启动 Visual Studio Installer ,然后点击修改 enter image description here

    2. 安装 ASP.NET和Web开发 enter image description here

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

      1. 在解决方案中添加新项目 enter image description here

      2. 选择ASP.NET Web应用程序(.Net Framework)并提供项目名称 enter image description here

      3. 选择Web API ,然后单击“确定” enter image description here

      4. 3)连接到SQL Server数据库

        1. 在“模型”文件夹中添加新项 enter image description here

        2. 选择ADO.NET实体数据模型并为其命名 enter image description here

        3. 从数据库中选择EF Designer ,然后单击“下一步” enter image description here

        4. 点击新建连接 enter image description here

        5. 配置连接,单击“确定”,然后单击“下一步” enter image description here

        6. 选择“实体框架版本”,然后单击“下一步” enter image description here

        7. 选择要连接的数据库和表,然后单击“完成” enter image description here

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

          1. 在继续之前重建您的项目 enter image description here

          2. 在Controllers文件夹中添加新控制器 enter image description here

          3. 使用操作选择Web API 2 Controller,使用Entity Framework ,然后单击“添加” enter image description here

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

          5. 5)测试API

            1. 将此项目设置为启动项目 enter image description here

            2. 在网络浏览器中运行项目 enter image description here

            3. 现在您的浏览器将打开一个localhost网站。顶部的点击API enter image description here

            4. 此页面显示项目中可用的所有API enter image description here

            5. 从下面复制任何API链接,并将其替换为"帮助"在URI中,按Enter键。现在,您应该能够从SQL Server数据库中查看数据 enter image description here

            6. 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);
              

              您可以从模型中获取模型类 enter image description here

              只需在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#

              的更多信息