2014-02-07 49 views
0

我想從一組行查詢行中讀取數據,並將每個記錄放入對象列表中的一個對象中,但我不知道單個記錄的數據類型是什麼在SqlDataReader中。SqlDataReader [i]數據類型

List<Response> responseList = new List<Response>(); 
for (int i = 0; reader.Read(); i++) //reader is the SqlDataReader 
    responseList.Add(new Response(reader[i])); 

什麼數據類型我設置Response構造函數的參數作爲?

public Response(IDataRecord r) //what's the data type suppose to be? 
{ 

} 
+0

你試過檢查您的直接窗口讀者[I] .GetType()? – user15741

回答

2

reader[i]是當前記錄的第i個字段的索引。的。例如,如果查詢是

SELECT ID, FNAME, LNAME, ADDRESS FROM CUSTOMERS 

那麼你的迴路試圖傳遞到您的功能字段ID在第一循環中,字段FNAME的第一個記錄的(I = 0)(I = 1)第二個循環中的第二個記錄,第三個循環中第三個記錄的字段LNAME(i = 2),然後是第四個記錄的字段ADDRESS(i = 3),最後(如果有超過四個記錄被檢索到)代碼崩潰,超出範圍異常(i = 4,但列僅爲4)

您需要構建一個對象Response,然後在將其添加到列表之前填充其屬性。
所以,還是假設你的對象響應具有四個屬性命名ID, FirstName, LastName, Address那麼你就寫

List<Response> responseList = new List<Response>(); 
while(reader.Read()) 
{ 
     responseList.Add(new Response() 
     { 
      ID = reader[0].ToString(), 
      FirstName = reader[1].ToString(), 
      LastName = reader[2].ToString(), 
      Address = reader[3].ToString() 
     }; 
} 
+0

我期待着大量的行和15列的響應。 'reader'是行數組,然後'reader [0]'通過'reader [14]'是字段嗎? – Shmoopy

+0

是的,對於字段而言,但讀者只包含一條記錄,您需要調用Read()方法將其移至下一條記錄。 – Steve

+0

好的,我只是看着它,然後。謝謝! – Shmoopy

1

首先改變你的閱讀條件,其次,你可以保存數據創建一個List <string>

List<string> responseList = new List<string>(); 

While (reader.Read()) 
{ 
    responseList.Add(reader[i]).ToString()); 
} 

您考慮,現在,所有的字段都保存在同一個目錄(響應列表),如果要單獨保存每個領域:(假設你選擇在你的SQL查詢3場)

List<string> List1 = new List<string>(); 
List<string> List2 = new List<string>(); 
List<string> List3 = new List<string>(); 
While (reader.Read()) 
    { 
     List1.Add(reader[0]).ToString());///1st field of select 
     List2.Add(reader[1]).ToString());///2nd field of select 
     List3.Add(reader[2]).ToString());///3rd field of select 

    } 
+0

看着史蒂夫的答案,設置響應的屬性匹配您的每個字段,是一個更好的方法.. – apomene