2014-12-06 27 views
0

以下哪種方式可以讀取和使用SqlDataReader返回的記錄比較好?比較處理SqlDataReader的方法返回值

1直接 - 使用數據:

<table> 
<%while(Reader.Read()){%> 
<tr> 
    <td><%Reader.GetInt32(0)%></td> 
    <td><%Reader.GetString(1)%></td> 
    <td><%Reader.GetBoolean(2)%></td> 
</tr> 
<%}%> 
</table> 

2讀取記錄於結構和儘快關閉連接,然後使用所讀取的數據的列表:

<%struct Data{ 
public int id; 
public string name; 
public bool active; 
} 
List<Data> Datas = new List<Data>(); 
    while(Reader.Read()){ 
    Datas.Add(new Data(){ 
     id = Reader.GetInt32(0), 
     name = Reader.GetString(1), 
     active = Reader.GetBoolean(2) 
    } 
} 
connection.Close();%> 
    <table> 
<%for(int i=0;i<Datas.Length;i++){%> 
    <tr> 
     <td><%Datas[i].id%></td> 
     <td><%=Datas[i].name%></td> 
     <td<%=Datas[i].active%></td> 
    </tr> 
    <% } %> 
    </table> 
+0

更好地以什麼方式?就您保持連接打開的時間而言,分隔UI和數據訪問問題,性能,可讀性......? – 2014-12-06 22:14:28

+0

@MichaelPetito我最關心的是性能,然後時間連接保持打開狀態 – 2014-12-06 22:35:47

回答

1

您的問題(和評論)建議您嘗試優化性能,但這可能是您提供的兩個樣本中最不顯着的方面。

我懷疑這兩種方法是否會顯示出明顯的性能增益,尤其是因爲SqlDataReader is buffering your results anyways。這就是說,你可能會遇到兩種情況下,這是不完全正確:

  • 迭代幾千條記錄,在這種情況下,您可以更快地發送一些結果到客戶端一樣#流的方法1。
  • 爲每條記錄執行大量工作,在這種情況下,您可能能夠像#2這樣的緩衝方法更快地關閉連接。

您應該考慮的是哪種方法具有更好的設計特性,同時仍能提供可接受的性能。在這種情況下,方法#2背後的思考過程絕對有優勢。從介紹問題(顯示Data的列表)makes your code more maintainable中分離數據訪問問題(檢索Data的列表)。

如果需要,您仍然可以通過讓數據訪問層返回流式傳輸IEnumerable<Data>而不是List<Data>來實現方法#1的流式傳輸特性。