2

我正在尝试从我的数据库中读取值。但是为什么我只得到没有列名的值?这是我的控制器。以 JSON 格式返回值

            SqlCommand cmd = con.CreateCommand();

            cmd.CommandText = "SELECT DISTINCT State FROM MyDBtable";

            con.Open();
            List<string> StateList = new List<string>();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                StateList.Add(reader[0].ToString());
            }

            return Json(new
            {
                myTable = StateList
            }, JsonRequestBehavior.AllowGet);

这是我的 JSON

{"myTable":["VA","CA"]}

在哪里,它应该给我

{"myTable":[{"State":"VA"},{"State":"CA"}]}

为什么不是读取和打印状态

4

2 回答 2

4

字符串没有属性“状态”。改为创建匿名类型:

myTable = StateList.Select(s => new { State = s })

更新:多列的最简单解决方案 - 为此创建一个 DTO

public class MyItem // of course use more descriptive name
{
   public string State { get; set; }
   public string Capital { get; set; }
   // etc
}

并从读者那里填写:

List<MyItem> items = new List<MyItem>();

while (reader.Read())
{
    MyItem item = new MyItem();
    item.State = reader[0].ToString(); 
    item.Capital = reader[1].ToString(); 
    // etc
    items.Add(item);
}

return Json(new {  myTable = items }, JsonRequestBehavior.AllowGet);

另一个示例(使用 Dapper,您可以在 NuGet 上找到)。添加using Dapper;到您的代码中。使用与上面相同的 DTO 类。

using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    return Json(new {
       myTable = connection.Query<MyItem>("SELECT * FROM MyDBtable").ToList()
    }, JsonRequestBehavior.AllowGet);
}
于 2012-11-15T19:21:56.333 回答
3

因为您正在选择状态。这将创建一个新对象,其中State属性被分配了状态,这样你就得到你想要的:

SqlCommand cmd = con.CreateCommand();

cmd.CommandText = "SELECT DISTINCT State FROM MyDBtable";

con.Open();
List<string> StateList = new List<string>();
SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
    StateList.Add(reader[0].ToString());
}

return Json(new
{
    myTable = StateList.Select(i => new { State = i })
}, JsonRequestBehavior.AllowGet);

有关其他列,请参阅lazyberezovsky 的答案,谁已更改StateList以解决此问题。

于 2012-11-15T19:21:38.610 回答