2016-12-07 31 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(); 
} 

我也試圖與ObservableCollection<ColumnItems> dataDetails更換var dataDetails但同樣沒有運氣失敗。我最終發現上述例外的資源非常少,並且不能收集太多的知識來解決這個例外。我如何填寫數據到我的ObservableCollection<T>

+0

讀者。廣播()拋出異常 – Steve

+0

Nope @Steve ..沒有例外,但是'DataList = new ObservableCollection (dataDetails);''拋出異常.. –

+0

它因爲linq延遲執行。它在使用之前不會被執行。你可以嘗試reader.Cast ().ToList()它應該拋出你看到的相同的異常 – Steve

回答

1

只是爲了因緣:-) IDataReader的是不是IEnumerable和沒有方法生產的IEnumerable 幸運的是,數據表是行的集合,如果你的表是不是非常大的可轉換爲枚舉

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

哦..那麼如果表是非常大的什麼方法?大約5200條記錄..:o –

+0

@GuruprasadRao使用讀取器逐行讀取。 TBH 5200不大 – Steve

+0

感謝澄清@Steve .. :) –

相關問題