2014-12-06 2 views
0

다음과 같은 SqlDataReader 반환 레코드를 사용하는 방법이 더 좋습니다.SqlDataReader 처리 방법 비교 반환 값

한 데이터를 직접 - 특수 :

<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와 데이터 액세스 문제, 성능, 가독성을 분리 할 수 ​​있습니까? –

+0

@MichaelPetito 나의 주요 관심사는 성능이며, 시간 연결이 열린 상태로 유지됩니다. –

답변

1

귀하의 질문을 (및 코멘트) 당신이 성능을 최적화하려고하는 것이 좋습니다,하지만 이것은 아마도 당신이 제공 한 두 샘플의 가장 구별 측면입니다.

어느 방법이든 특히 SqlDataReader is buffering your results anyways부터 상당한 성능 향상을 보일 것으로 예상됩니다. 즉, 다음과 같은 두 가지 상황이 발생할 수 있습니다.

  • 수천 개의 레코드를 반복하면 클라이언트에 스트리밍 방식으로 더 빠르게 결과를 보낼 수 있습니다. 1.
  • 각 레코드에 대해 많은 작업을 수행하는 경우 # 2와 같은 버퍼 방식으로 연결을 더 빨리 종료 할 수 있습니다.

허용되는 성능을 제공하면서도 더 나은 디자인 특성을 갖는 접근 방식을 고려해야합니다. 이 경우, 접근법 # 2의 사고 과정에는 확실히 장점이 있습니다. 데이터 액세스 문제 (Data의 목록 검색)를 프레젠테이션 관련 문제 (Data 목록 표시)와 분리합니다. makes your code more maintainable.

필요한 경우 데이터 액세스 레이어가 List<Data> 대신에 IEnumerable<Data>의 스트리밍을 반환하도록하여 접근 # 1의 스트리밍 특성을 얻을 수 있습니다.