2016-12-07 4 views
0

Я пытаюсь конвертировать записи из MySqlDataReader в ObservableCollection<T>, но я всегда в конечном итоге, за исключением - Невозможно привести объект типа «System.Data.Common.DataRecordInternal» к типу «System.Data. IDataReader»Преобразование MySqlDataReader записей в ObservableCollection <T>

от Jon Skeet's answer over here и ссылаясь SLaks комментарий в тот же ответ, я закончил писать ниже код, но до сих пор я не нашел, как я получаю это исключение.

ObservableCollection<ColumnItems> DataList; 
using (MySqlCommand cmd = new MySqlCommand(_query)) 
{ 
     await Global.currentConnection.OpenAsync(); 
     cmd.Connection = Global.currentConnection; 
     MySqlDataReader reader = cmd.ExecuteReader(); 
     var dataDetails = reader.Cast<IDataReader>().Select(x => new ColumnItems 
     { 
      col1 = x["col1"] is DBNull ? null : x["col1"].ToString(), 
      col2 = x["col2"] is DBNull ? null : x["col2"].ToString(), 
      col3 = x["col3"] is DBNull ? null : x["col3"].ToString(), 
      col4 = x["col4"] is DBNull ? null : x["col4"].ToString() 
     }); 
     DataList = new ObservableCollection<ColumnItems>(dataDetails); 
     //Exception while assigning data 
     await Global.currentConnection.CloseAsync(); 
} 

Я также попытался заменить var dataDetails с ObservableCollection<ColumnItems> dataDetails но опять не без везения. Я закончил тем, что нашел очень мало ресурсов для вышеупомянутого исключения и не смог собрать много знаний для решения этого исключения. Как я могу заполнить данные в своем ObservableCollection<T>?

+0

reader.Cast () выбрасывает это исключение – Steve

+0

Nope @Steve .. Никаких исключений, кроме 'DataList = new ObservableCollection (dataDetails);' is throwing exception .. –

+0

его потому, что linq задерживает выполнение. он не выполняется до его использования. Вы можете попробовать reader.Cast () .ToList(), и он должен бросить то же исключение, которое вы видите – Steve

ответ

1

Просто для кармы :-) IDataReader не IEnumerable и не имеет способа получения IEnumerable К счастью, DataTable это коллекция строк и может быть преобразован в перечислимый Если таблица не очень большой

DataTable dt = new DataTable(); 
dt.Load(reader); 
var dataDetails=dt.AsEnumerable().Select(... 
+0

Ох .. Так какой подход, если стол очень большой? Около 5200 записей ..: o –

+0

@GuruprasadRao использовать читателя для чтения подряд за строкой. TBH 5200 не большой – Steve

+0

Спасибо за разъяснение @Steve .. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^