2014-12-06 46 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的流式传输特性。