2016-12-27 2 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(); 

ли это поможет?

убедитесь, что ваш запрос не возвращает повторяющиеся значения идентификатора (ключ в словаре), потому что вы получите исключение.

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

Edit: В случае, если вы хотите сохранить 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

Да, вы правы. Но мне нужна таблица данных для некоторых целей. Представьте некоторые другие идеи. @ Дмитрий Быченко – monica

+0

@monica: in 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

Группа By (x => x.Field (« XX »), y => y.Field ("YY")). Если XX - дата, а YY - строка, то как это сделать? @ jdweng – monica

+0

Тип в угловых скобках <> должен совпадать с столбцами в базе данных. Таким образом, в вашем случае объектом будет y.Field («Id») или DateTime.Parse (y.Field («Id»)), если вы преобразовываете строку в DateTime. – jdweng

+0

Я не мог понять. Можете ли вы написать его в виде кода? – monica