【问题标题】:Web API to query SQL Server and return result is not working as expected用于查询 SQL Server 并返回结果的 Web API 未按预期工作
【发布时间】:2019-03-15 17:19:14
【问题描述】:

我正在尝试从 Web API 连接到 SQL Server 并将结果集返回为 JSON。但是我在这里显示的代码没有按预期工作。我正在尝试将整个查询响应作为 JSON 返回:

[HttpGet]
public HttpResponseMessage Getdetails(string ROOM)
{
    string commandText = "SELECT * from [TDB].[dbo].[results_vw] where ROOM = @ROOM_Data";

    string connStr = ConfigurationManager.ConnectionStrings["TDBConnection"].ConnectionString;

    var jsonResult = new StringBuilder();

    using (SqlConnection connection = new SqlConnection(connStr))
    {
        SqlCommand command = new SqlCommand(commandText, connection);
        command.Parameters.Add("@ROOM_Data", SqlDbType.VarChar);
        command.Parameters["@ROOM_Data"].Value = ROOM;

        connection.Open();

        var reader = command.ExecuteReader();

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

        var response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
        response.Content = new StringContent(jsonResult.ToString());

        connection.Close();

        return response;
    }
}

此代码返回此结果:

333838362692368203368203368203362692368203359544362692368203362692368203362692368203368203

我期望 JSON 为

 {"data":
  [
  {"R_ID":"368203","ROOM":"K2"}, 
  {"R_ID":"368203","ROOM":"K2"}
  ]}

现在我创建了一个名为 DatabaseResult 的模型类来存储响应,但我不确定如何将结果存储到控制器中的模型类中

public class DatabaseResult
{
      public int r_id { get; set; }
      public string room { get; set; }
}

【问题讨论】:

  • 那是因为你只返回每行第一列的值
  • 我建议使用 Dapper 库来帮助您进行 ADO 调用。
  • @Nkosi 我可以使用 Model 类而不是使用额外的库来存储响应吗?
  • 是的。我只是建议这样做,因为它会使事情变得更容易。
  • @Nksoi 我不确定如何将它们存储在模型类中

标签: asp.net sql-server asp.net-web-api sqlconnection sqlcommand


【解决方案1】:

当前结果是因为您只返回每行第一列的值并将其添加到字符串生成器。

创建模型的新实例并使用读取器中每行的值填充它。

[HttpGet]
public IHttpActionResult Getdetails(string ROOM) {
    string commandText = "SELECT * from [TDB].[dbo].[results_vw] where ROOM = @ROOM_Data";
    string connStr = ConfigurationManager.ConnectionStrings["TDBConnection"].ConnectionString;
    var jsonResult = new StringBuilder();
    using (SqlConnection connection = new SqlConnection(connStr)) {
        using (SqlCommand command = new SqlCommand(commandText, connection)) {
            command.Parameters.Add("@ROOM_Data", SqlDbType.VarChar);
            command.Parameters["@ROOM_Data"].Value = ROOM;
            connection.Open();
            List<DatabaseResult> records = new List<DatabaseResult>();
            using (var reader = command.ExecuteReader()) {
                while (reader.Read()) {
                    var row = new DatabaseResult {
                        r_id = (int)reader["r_id"],
                        room = (string)reader["room"],
                        //...other properties.
                    };
                    records.Add(row);
                }
                return Ok(records);
            }
        }
    }
}

上面使用列名作为索引器从读取器获取值。

【讨论】:

  • @Nksoi 非常感谢。我在房间 room = (string)reader["room"], 收到一个错误,说它在上下文中不存在
  • @trx 我对列名做了一个假设。 K2 数据可能来自哪个列?列名需要来自表中的那些
  • 这是我的错误,我在r_id = (int)reader["r_id"], 旁边有一个分号现在我遇到了return Ok(records) 的问题,因为它说它在正确的上下文中不存在。是不是因为我使用HttpResponseMessage 作为返回类型
  • @trx 是的。查看我的答案中的代码,您将看到操作的返回类型。它简化了你所拥有的。在引擎盖下它基本上做同样的事情。这种方式语法更简单
  • 感谢它的工作。只需检查一下,我们是否可以将查询的响应转储到模型类中,并遍历每个列名称,例如JsonConvert.DeserializeObject&lt;DatabaseResult&gt;(queryResponse)?因为我得到Unable to cast object of type 'System.DBNull' to type 'System.String'.
猜你喜欢
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多