比较处理SqlDataReader返回值的方法

时间:2014-12-06 21:33:16

标签: c# asp.net sql-server 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>

1 个答案:

答案 0 :(得分:1)

您的问题(和评论)表明您正在尝试优化效果,但这可能是您提供的两个样本中最不显眼的方面。

我怀疑这两种方法都会显示出明显的性能提升,特别是自SqlDataReader is buffering your results anyways以来。也就是说,您可能会遇到两种情况,这种情况并非如此:

  • 迭代了数千条记录,在这种情况下,您可以通过#1等流媒体方式更快地向客户端发送一些结果。
  • 为每条记录执行大量工作,在这种情况下,您可以使用#2等缓冲方法更快地关闭连接。

您应该考虑的是哪种方法具有更好的设计特性,同时仍然提供可接受的性能。在这种情况下,方法#2背后的思维过程肯定具有优势。从演示文稿问题中分离数据访问问题(检索Data列表)(显示Datamakes your code more maintainable列表。

如果您需要,您仍然可以通过让您的数据访问层返回流IEnumerable<Data>而不是List<Data>来实现方法#1的流式传输特性。