【问题标题】:c# SELECT with FOR JSONc# SELECT with FOR JSON
【发布时间】:2019-02-05 01:47:32
【问题描述】:

我正在使用 SQL Server 2008 R2,我想在 ASP.NET 中构建一个 Web 表单,该表单在我的数据库上运行 SELECT 命令并从中创建一个 json。

这是我的代码:

using (SqlConnection connection = new SqlConnection(ConnectionString))
{
    String query = "SELECT * FROM dbo.apartments FOR JSON";

    using (SqlCommand command = new SqlCommand(query, connection))
    {
        connection.Open();

        var jsonResult = new StringBuilder();
        var reader = command.ExecuteReader();

        if (!reader.HasRows)
        {
            jsonResult.Append("[]");
        }
        else
        {
            while (reader.Read())
            {
                jsonResult.Append(reader.GetValue(0).ToString());
            }
        }

        connection.Close();
    }
}

当我运行它时,我得到了这个错误:

异常详细信息:System.Data.SqlClient.SqlException:“JSON”附近的语法不正确。

【问题讨论】:

  • FOR JSON 在查询字符串中做了什么?另外我不建议手动创建 JSON,而是尝试对象序列化(即 JSON.NET)
  • FOR JSON 是 SQL Server 2016 中的新功能,在早期版本中不可用

标签: c# sql asp.net .net sql-server


【解决方案1】:

注意:SQL Server 2016 添加了对 JSON 格式的新支持。

更改您的 SQL 并使用 FOR JSON AUTOFOR JSON PATH 来获得预期的输出

syntax

【讨论】:

    【解决方案2】:

    我认为您使用的是旧版本的 SQL Server。 JSON 功能已添加到 SQL 版本 2016。

    【讨论】:

      【解决方案3】:

      可以使用 FOR JSON 将查询结果格式化为 JSON starting with 2016。 您可以使用 SqlDataReader 读取数据,然后在 C# 代码中手动创建 json(例如使用 Json.Net,请参阅 Creating JSON

      【讨论】:

        【解决方案4】:

        作为Lennart Stoop 建议的选项是将所有项目读取到您的对象,然后使用 JSON.NET 序列化为 Json。

        Nuget package needed NewtonSoft.Json
        using Newtonsoft.Json;
        

        例子是

        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
           String query = "SELECT * FROM dbo.apartments";
        
           using (SqlCommand command = new SqlCommand(query, connection))
           {
               connection.Open();
               List<MyObject> myObjectList= new List<MyObject>();
               var reader = command.ExecuteReader();
               if (reader.HasRows)
               {
                  while (reader.Read())
                  {    MyObject myObject = new MyObject();
                       myObject.Name = reader["Name"].ToString();
                       myObjectList.Add(myObject);
                  }
               }
              var JsonResult = JsonConvert.SerializeObject(myObjectList);
            } 
        }
        

        JsonResult 是你想要的 json 对象

        EDIT 修改为使用 List 以获得更好的示例

        【讨论】:

          【解决方案5】:

          您遇到的异常错误是由于查询中的语法错误。使用FOR JSON 关键字时,您需要以AUTOPATH 结尾。因此,您的查询需要是:

          String query = "SELECT * FROM dbo.apartments FOR JSON AUTO";
          

          或:

          String query = "SELECT * FROM dbo.apartments FOR JSON PATH";
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-01-18
            • 1970-01-01
            • 2017-09-27
            • 2013-04-08
            • 1970-01-01
            • 1970-01-01
            • 2017-09-16
            • 1970-01-01
            相关资源
            最近更新 更多