2016-12-27 48 views
1
public static Dictionary<string, object> LonView() 
     { 
      string sql = "SELECT Marks,Id FROM table4"; 
      using (SqlConnection Connection = new SqlConnection((@"DataSource"))) 
      { 
       using (SqlCommand myCommand = new SqlCommand(sql, Connection)) 
       { 
        Connection.Open(); 
        using (SqlDataReader myReader = myCommand.ExecuteReader()) 
        { 
         DataTable dt = new DataTable(); 
         dt.Load(myReader); 
         Connection.Close(); 
    Dictionary<string, object> lst = new Dictionary<string, object>(); 
         var tableEnumerable = dt.AsEnumerable(); 
         var tableArray = tableEnumerable.ToArray(); 
       foreach (var data in tableArray) 
         { 
         lst.Add(data["id"].ToString(),data["Marks"] as string); 
         } 

return lst; 
      } 
     } 
    } 
} 

我想將我的數據表格列轉換爲字典並返回數組中的字典{[「A」,30],[「B」,32],[「C 「,45]} form.Suggest一些想法做我的任務。將數據表內容加載到字典

回答

0

看看這個例子:

 DataTable table = new DataTable(); 
     table.Columns.Add("Id", typeof(string)); 
     table.Columns.Add("Marks", typeof(int)); 
     table.Rows.Add(new object[] { "A", 50 }); 
     table.Rows.Add(new object[] { "B", 100 }); 
     table.Rows.Add(new object[] { "C", 200 }); 

     Dictionary<string, int> dict = new Dictionary<string, int>(); 
     foreach (DataRow row in table.Rows) 
     { 
      dict.Add(row[0].ToString(), Convert.ToInt32(row[1].ToString())); 
     } 

     var arr = dict.ToArray(); 

這是否幫助你嗎?

請確保您的查詢沒有返回重複的ID值(您的字典中的鍵),因爲您會收到異常。

+0

感謝您的答覆,其實內容加載到字典準確。但一列。作爲一個密鑰。我想加載沒有密鑰。怎麼辦?@Nino – monica

0

您沒有創建任何DataTable,臨時Dictionary:一個簡單的直接while循環會做

string sql = 
    @"SELECT Marks, 
      Id 
     FROM table4"; 

using (SqlConnection Connection = new SqlConnection((@"DataSource"))) { 
    using (SqlCommand myCommand = new SqlCommand(sql, Connection)) { 
    Connection.Open(); 

    // We don't know the final array's length; let's use a list as a buffer 
    List<string[]> buffer = new List<string[]>(); 

    using (SqlDataReader myReader = myCommand.ExecuteReader()) { 
     while (myReader.Read()) 
     buffer.Add(new string[] { 
      Convert.ToString(myReader["id"]), 
      Convert.ToString(myReader["Marks"]), 
     }); 
    } 

    return buffer.ToArray(); 
    }   
} 

編輯:在您希望保留DataTable爲了某種目的

using (SqlConnection Connection = new SqlConnection((@"DataSource"))) { 
    using (SqlCommand myCommand = new SqlCommand(sql, Connection)) { 
    Connection.Open(); 

    using (SqlDataReader myReader = myCommand.ExecuteReader()) { 
     DataTable dt = new DataTable(); 
     dt.Load(myReader); 

     // You can obtain the string[][] array via Linq: 
     string[][] result = dt 
     .AsEnumerable() 
     .Select(record => new string[] { 
      Convert.ToString(record["id"]), 
      Convert.ToString(record["Marks"]), }) 
     .ToArray(); 

     ... 
    } 
    ... 
情況
+0

是的,你說得對,但我需要數據表爲某些Purpose.Suggest一些其他的想法。@德米特里Bychenko – monica

+0

@monica:在t他的情況(保留'DataTable dt'),您可以通過* Linq *獲取鋸齒陣列(請參閱我的編輯) –

0

試試這個例子

dt.AsEnumerable() 
     .ToDictionary<DataRow, string, object>(row => row.Field<string>(0), 
           row => row.Field<object>(1)); 

這會幫助你。

0

要求很簡單:

 public static Dictionary<string, object> LonView() 
     { 
      string sql = "SELECT Marks,Id FROM table4"; 
      Dictionary<string, object> lst = null; 
      using (SqlConnection Connection = new SqlConnection((@"DataSource"))) 
      { 
       using (SqlDataAdapter adapter = new SqlDataAdapter(sql, Connection)) 
       { 
        DataTable dt = new DataTable(); 
        adapter.Fill(dt); 
        Connection.Close(); 
        lst = dt.AsEnumerable() 
         .GroupBy(x => x.Field<string>("Marks"), y => y.Field<object>("Id")) 
         .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 
       } 
      } 
      return lst; 

     } 

如果在數據庫中值是一個DateTime

 public static Dictionary<string, DateTime> LonView() 
     { 
      string sql = "SELECT Marks,Id FROM table4"; 
      Dictionary<string, DateTime> lst = null; 
      using (SqlConnection Connection = new SqlConnection((@"DataSource"))) 
      { 
       using (SqlDataAdapter adapter = new SqlDataAdapter(sql, Connection)) 
       { 
        DataTable dt = new DataTable(); 
        adapter.Fill(dt); 
        Connection.Close(); 
        lst = dt.AsEnumerable() 
         .GroupBy(x => x.Field<string>("Marks"), y => y.Field<DateTime>("Id")) 
         .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 
       } 
      } 
      return lst; 

     } 
+0

Group By(x => x.Field (「XX」),y => y.Field (「YY」))。如果XX是日期時間並且YY是字符串,那麼如何執行此操作? @ jdweng – monica

+0

尖括號<>中的類型必須與數據庫中的列相同。因此,如果您要將字符串轉換爲DateTime,則在您的案例中,對象應該是y.Field (「Id」)或DateTime.Parse(y.Field (「Id」))。 – jdweng

+0

我無法理解,請你用代碼形式寫下來? – monica