2012-11-15 52 views
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"}]} 

爲什麼不能閱讀和打印狀態

+0

使用調試器,並通過你的代碼期待值步驟,你會很快發現了錯誤的路線,你將有一個更簡潔的問題。當然,這個例子對我們來說仍然很簡單,但是在更大的代碼中它可能並不那麼明顯。 –

+0

嗨湯姆..我知道這是閱讀正確的數據...我的表作爲幾列......其中之一是國家......它有像「VA」,「CA」的國家列表...我是什麼試圖做的是閱讀我的桌子上的所有狀態......它在做什麼......但不打印列的名稱......我猜測我設置LIST數組的方式不對 – EagleFox

+1

什麼我在說的是調試器會告訴你'StateList.Add(reader [0] .ToString());'只是添加狀態字符串而不再是'State'屬性。 –

回答

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's answer誰改變了StateList來解決這個問題。

+0

謝謝湯姆...任何想法,爲什麼我會得到語法錯誤 – EagleFox

+0

評論這裏已被刪除。但作爲參考,還有一個';'。 –

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); 
} 
+0

感謝lazyberezovsky ...在哪裏應該把這個在我的代碼 – EagleFox

+1

@EagleFox創建Json時 - 用這個代碼 –

+0

代替'myTable = StateList'謝謝你們倆...但是我的語法錯誤...我已經肯定我已經做了你會說 – EagleFox