用于使用 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 数据库
如何从 Azure SQL 迁移到 SQL Server? [复制]