用于使用 Azure SQL Server 数据的 C# Web API

Posted

技术标签:

【中文标题】用于使用 Azure SQL Server 数据的 C# Web API【英文标题】:C# Web API to consume Azure SQL Server Data 【发布时间】:2019-02-19 09:31:25 【问题描述】:

如果您能指出正确的地方或正确的想法,我将不胜感激。我已经很久没有做过 C# 了,我也不确定我在做什么了。

基本上我有一个基于 Azure 的 MSSQL 数据库,我需要从我的 iPhone 应用程序中读取数据并以 JSON 格式返回该数据。 Azure API 不允许您直接从 DB 中读取,但您可以构建一个 .Net Web API 并使用它——这就是我去的地方。

我已经完成了第一部分的工作。我可以发出一个 http 请求,Azure 响应良好。我还构建了数据库和表,并且我已经测试了所有这些并且它可以工作。我还测试了查询,它运行格式良好的 JSON。

但是,我需要将数据读取器中的数据作为 http 响应传递,我无法弄清楚那部分。附件是两个 vanilla 文件。一个发出虚拟 http 请求,另一个是 db 连接器文件。

所以简而言之,在 Function1.cs 文件中我需要从

:req.CreateResponse(HttpStatusCode.OK, "Hello" + name);到 :req.CreateResponse(HttpStatusCode.OK, );

第一个文件:Function1.cs

namespace getOutageAlerts

公共静态类 Function1 [函数名称(“函数 1”)] 公共静态异步任务运行([HttpTrigger(AuthorizationLevel.Function,“get”,“post”,Route = null)]HttpRequestMessage req,TraceWriter log) log.Info("C# HTTP 触发函数处理了一个请求。");

        // parse query parameter
        string name = req.GetQueryNameValuePairs()
            .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
            .Value;

        if (name == null)
        
            // Get request body
            dynamic data = await req.Content.ReadAsAsync<object>();
            name = data?.name;
        

        return name == null
            ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
            **:req.CreateResponse(HttpStatusCode.OK, "Hello" + name);**

    

第二个文件:DBConnector.cs

using System;
using System.Data.SqlClient;


public class DBConnector

    public DBConnector()
    
        SqlConnection getalertsConnection = new SqlConnection("Server=tcp:xxxxxxxxx.database.windows.net,1433;Initial Catalog=mckMobileAppsDB;Persist Security Info=False;User ID=xxxxxxx;Password=xxxxxxxx;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;");
        SqlCommand cmd = new SqlCommand();
        SqlDataReader reader;

        cmd.CommandText = "SELECT Date_Created As Date, Incident_Number AS Incident, Flash_Summary AS Summary, Service, Business_Impact AS Impact, Incident_Status AS Status from OutagesMobileAppNotifications FOR JSON PATH, Root('Alerts')";
        cmd.CommandType = CommandType.Text;
        cmd.Connection = getalertsConnection;

        getalertsConnection.Open();

        reader = cmd.ExecuteReader();
        // Data is accessible through the DataReader object here.


        getalertsConnection.Close();
    

【问题讨论】:

【参考方案1】:

您的问题措辞有点尴尬,而且格式错误也无济于事。但是,您似乎想从 Azure 无服务器函数返回 JSON。基于这个假设,我将尝试回答。

要返回 JSON,您需要添加 Newtonsoft.Json 包。这很简单,在函数的顶部添加以下内容:

#r "Newtonsoft.Json"
using System.Net;
using System.Text;
using Newtonsoft.Json;
using System.Linq;

(编辑:为 System.Linq 添加了 using 语句,以便数据读取器可以使用 Select。)

在您编写的 DBConnector 中,我会将读取器转换为对象数组,然后将该结果序列化为 JSON。 (为简洁起见,我已将您的字段列表截断为 jsut 2...您显然需要添加整个列表。)

var incidents = dataReader.Select(m => new  m.Date, m.Incident ).ToList();
var jsonResult = JsonConvert.SerializeObject(incidents, Formatting.Indented);

然后返回 JSON。

return new HttpResponseMessage(HttpStatusCode.OK) 
    Content = new StringContent(jsonResult, Encoding.UTF8, "application/json")
;

(我正试图凭记忆做到这一点……而且我已经有大约一年没有使用 Azure Functions 了……所以确切的代码可能会有所不同。)

另外...由于您已经有一段时间没有使用过 C# 并且可能从未使用过 Azure Functions,因此将所有内容都放在同一个函数中可能会更简单。我的意思是你不必有第二个类/文件......你可以把所有的 SQL 工作放在你的 main 方法中。我通常认为这是一种不好的做法,但在短期内它可能会减轻您的工作量。

【讨论】:

非常感谢 - 我似乎还有一个问题.. datareader 没有选择方法.. var Incidents = dataReader.Select(m => new m.Date, m.事件,m.Summary,m.Service,m.Impact,m.Status ).ToList();我尝试了 GetValues,但也没有用.. 您需要添加“使用 System.Linq;”在顶部。 (我将编辑我的答案以显示这一点。) 为清楚起见...如果将 .Select() 添加到 DBConnector 类中,则需要在其中添加用于 Linq 的 using 语句。 我按照您的建议将所有内容移至主类。我正在使用 System.Ling

以上是关于用于使用 Azure SQL Server 数据的 C# Web API的主要内容,如果未能解决你的问题,请参考以下文章

Azure SQL Server 备份:需要使用 ARM 模板在 Azure SQL Server 备份中取消注册容器和重新转移数据库

Azure 数据工厂问题将数据从本地 sql Server 写入 Azure SQL 数据库

MS SQL Server迁移至SQL Azure

如何从 Azure SQL 迁移到 SQL Server? [复制]

将 Azure 数据工厂上的数据管道从 SQL Server 复制到 Blob 存储

Azure SQL Database (20) 使用SQL Server 2016 Upgrade Advisor