2013-06-04 89 views
3

我有一個查詢,我對數據庫運行,我可以看到有一個記錄爲31/05/2013。當我運行從C#與ADO.NET此查詢,然後使用下面的代碼,我缺少的紀錄31/05/2013Casting Ado.net DataReader給IDataRecord給出奇怪的結果

var timeSeriesList = new List<TimeSeries>(); 
using (var reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     timeSeriesList = reader.Cast<IDataRecord>() 
      .Select(r => new TimeSeries 
       { 
        MidRate = (double)r["MidRate"], 
        RiskFactorName = (string)r["RiskFactorName"], 
        SeriesDate = (DateTime)r["SeriesDate"] 
       }).ToList(); 

    } 
} 

但是,如果我用這個代碼相同的查詢:

var timeSeriesList = new List<TimeSeries>();       
using (var reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     var timeSeries = new TimeSeries 
       { 
        MidRate = (double)reader["MidRate"], 
        RiskFactorName = (string)reader["RiskFactorName"], 
        SeriesDate = (DateTime)reader["SeriesDate"] 
       }; 

     timeSeriesList.Add(timeSeries); 
    } 
} 

...然後在31/05/2013的記錄是在收集 - 爲什麼會第一個代碼塊給這個結果呢?

+0

您的意思是重新創建第二個While循環內的變量時間序列例?我假設一個錯字? – Dave

+0

其他領域他們有什麼價值?丟失的記錄 –

+0

@DaveRook,是的,對不起,這是一個錯字 – christiandev

回答

6

我認爲你在第一個例子中缺少記錄,因爲你將讀者移動一個,然後施放它。

試試這個變化,看看它的工作:

var timeSeries = new List<TimeSeries>(); 
using (var reader = cmd.ExecuteReader()) 
{ 
    if (reader.HasRows) 
    { 
     timeSeries = reader.Cast<IDataRecord>() 
      .Select(r => new TimeSeries 
       { 
        MidRate = (double)r["MidRate"], 
        RiskFactorName = (string)r["RiskFactorName"], 
        SeriesDate = (DateTime)r["SeriesDate"] 
       }).ToList(); 
    } 
} 
3

有通過數據讀取器遍歷的兩種方式;一個是繼續撥打.Read();另一種是將其視爲IEnumerable序列IDataRecordforeach它;不管你選擇哪一個,你只能迭代一次數據。

  • 調用從轉爐到第一條記錄.Read()移動,如果一個
    • ToList()電話GetEnumerator()然後MoveNext()在一個循環,這立即向前移動一個位置(所以我們放棄了第一個在地板上的記錄沒有處理它);在ToList()結束時,我們已經完成了所有的數據
  • 咀嚼使外.Read()然後將基本上報告false(EOF)

:這裏的問題是使用進度位置兩個API。請使用.Read()或使用foreach API(.ToList())。

作爲一個側面說明,因爲列名稱匹配成員名稱,你也可以使用「短小精悍」做繁重:

var list = conn.Query<TimeSeries>(sql, args).ToList(); 
+0

感謝您指出小巧,我會看看這個。 – christiandev