比较处理 SqlDataReader 返回值的方法

本文关键字:方法 返回值 SqlDataReader 处理 比较 | 更新日期: 2023-09-27 18:33:18

以下哪种方式读取和使用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 返回值的方法

您的问题(和评论(表明您正在尝试优化性能,但这可能是您提供的两个示例中最不显着的方面。

我怀疑这两种方法都不会显示出明显的性能提升,特别是因为 SqlDataReader 无论如何都会缓冲您的结果。 也就是说,您可能会遇到两种不太正确的情况:

  • 遍历数千条记录,在这种情况下,您可以通过 #1 等流式处理方法更快地将一些结果发送到客户端。
  • 对每条记录执行大量工作,在这种情况下,您可以使用像 #2 这样的缓冲方法更快地关闭连接。

相反,您应该考虑的是哪种方法具有更好的设计特征,同时仍提供可接受的性能。 在这种情况下,方法#2背后的思维过程肯定具有优势。 将数据访问关注点(检索Data列表(与表示关注点(显示Data列表(分开,使您的代码更易于维护。

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