以下哪种方式读取和使用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>
您的问题(和评论(表明您正在尝试优化性能,但这可能是您提供的两个示例中最不显着的方面。
我怀疑这两种方法都不会显示出明显的性能提升,特别是因为 SqlDataReader 无论如何都会缓冲您的结果。 也就是说,您可能会遇到两种不太正确的情况:
- 遍历数千条记录,在这种情况下,您可以通过 #1 等流式处理方法更快地将一些结果发送到客户端。
- 对每条记录执行大量工作,在这种情况下,您可以使用像 #2 这样的缓冲方法更快地关闭连接。
相反,您应该考虑的是哪种方法具有更好的设计特征,同时仍提供可接受的性能。 在这种情况下,方法#2背后的思维过程肯定具有优势。 将数据访问关注点(检索Data
列表(与表示关注点(显示Data
列表(分开,使您的代码更易于维护。
如果需要,仍可以通过让数据访问层返回流式处理IEnumerable<Data>
而不是List<Data>
来实现方法 #1 的流式处理特征。