如何从 sql 服务器 2016 获取 JSON 数据并将其原样(使用 IHttpActionResult)通过 Web API 发送到客户端
How to get JSON data from sql server 2016 and send it as it is (using IHttpActionResult) to client by web API
在 Sql 服务器 2016 之后,我们可以通过以下语句 select 数据直接作为 JSON:
SELECT Top (10) * from Products FOR JSON AUTO
所以我们不再需要将它们赋值给对象,再将它们JSON转换成代码。
我认为我们可以降低流程的复杂性并获得更好的性能。
我使用 web API 2,我想接收并直接发送给 cleint 。
这是与 SqlCommand 一起使用的任何新功能或方法吗?云你帮帮我好吗?
此 sample 展示了如何使用 SqlCommand 从 SQL 服务器读取 JSON:
var queryWithForJson = "SELECT ... FOR JSON";
var conn = new SqlConnection("<connection string>");
var cmd = new SqlCommand(queryWithForJson, conn);
conn.Open();
var jsonResult = new StringBuilder();
var reader = cmd.ExecuteReader();
if (!reader.HasRows)
{
jsonResult.Append("[]");
}
else
{
while (reader.Read())
{
jsonResult.Append(reader.GetValue(0).ToString());
}
}
在您的 ApiController 中,您可以 return 使用 ResponseMessage
方法的字符串:
public IHttpActionResult Get()
{
var jsonResult = new StringBuilder();
/// get JSON
var response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
response.Content = new StringContent(jsonResult.ToString());
return ResponseMessage(response);
}
然而,尽管技术上可行,恕我直言,在走这条路时您应该考虑一些缺点:
- 您失去了从 Web API 协商您 return 的内容类型的能力。如果您稍后必须为请求 XML 的客户端提供服务,则您无法轻松做到这一点。
- 另一个缺点,也许是次要缺点,是您降低了扩展 JSON 转换的能力。通常您有一个数据库服务器,而您可以有多个 Web 前端。显然你需要数据库服务器来获取数据,但你可以将转换的负载放在一个你可以更好地扩展的地方。
我认为让 SQL 服务器将二进制格式的数据传送到执行转换的前端会更有效。我怀疑将此负载放在数据库服务器上会快得多 - 当然这取决于基础架构。
在 Sql 服务器 2016 之后,我们可以通过以下语句 select 数据直接作为 JSON:
SELECT Top (10) * from Products FOR JSON AUTO
所以我们不再需要将它们赋值给对象,再将它们JSON转换成代码。 我认为我们可以降低流程的复杂性并获得更好的性能。 我使用 web API 2,我想接收并直接发送给 cleint 。 这是与 SqlCommand 一起使用的任何新功能或方法吗?云你帮帮我好吗?
此 sample 展示了如何使用 SqlCommand 从 SQL 服务器读取 JSON:
var queryWithForJson = "SELECT ... FOR JSON";
var conn = new SqlConnection("<connection string>");
var cmd = new SqlCommand(queryWithForJson, conn);
conn.Open();
var jsonResult = new StringBuilder();
var reader = cmd.ExecuteReader();
if (!reader.HasRows)
{
jsonResult.Append("[]");
}
else
{
while (reader.Read())
{
jsonResult.Append(reader.GetValue(0).ToString());
}
}
在您的 ApiController 中,您可以 return 使用 ResponseMessage
方法的字符串:
public IHttpActionResult Get()
{
var jsonResult = new StringBuilder();
/// get JSON
var response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
response.Content = new StringContent(jsonResult.ToString());
return ResponseMessage(response);
}
然而,尽管技术上可行,恕我直言,在走这条路时您应该考虑一些缺点:
- 您失去了从 Web API 协商您 return 的内容类型的能力。如果您稍后必须为请求 XML 的客户端提供服务,则您无法轻松做到这一点。
- 另一个缺点,也许是次要缺点,是您降低了扩展 JSON 转换的能力。通常您有一个数据库服务器,而您可以有多个 Web 前端。显然你需要数据库服务器来获取数据,但你可以将转换的负载放在一个你可以更好地扩展的地方。
我认为让 SQL 服务器将二进制格式的数据传送到执行转换的前端会更有效。我怀疑将此负载放在数据库服务器上会快得多 - 当然这取决于基础架构。