2013-07-10 3 views
1

DataSet을 사용하여 비동기 DB 연결 메서드를 구현해야하므로 먼저 SqlDataReader를 사용하여 DataSet을 채우려고했습니다. 그러나 너무 많은 시간이 걸립니다. 나는이 두 가지 방법은 정확히 같은 일을 생각 DataTable.Load()가 SqlDataAdapter.Fill()에 비해 너무 많은 시간이 걸립니다.

DataSet ds = new DataSet(); 
using (SqlConnection conn = new SqlConnection(conString)) 
{ 
    ... 
    SqlDataAdapter adapter = new SqlDataAdapter(); 
    adapter.SelectCommand = cmd; 
    adapter.Fill(ds); 
} 

SqlDataAdapter.Fill

를 사용 DataTable.Load

DataSet ds = new DataSet(); 
using (SqlConnection conn = new SqlConnection(conString) 
{ 
    SqlCommand cmd = new Sqlcommand(query, conn); 
    conn.Open(); 
    SqlDataReader reader = cmd.ExecuteReader(); 

    while (!reader.IsClosed) 
    { 
     DataTable dt = new DataTable(); 
     dt.BeginLoadData(); 
     ////////////////////////////////////// 
     dt.Load(reader);  // takes too much 
     ////////////////////////////////////// 
     dt.EndLoadData(); 
     ds.Tables.Add(dt); 
    } 
} 

사용

:

여기에 코드입니다. 그러나 DB에서 2400 행을 읽을 때 첫 번째 방법은 평균 20ms가 걸리고, 그렇지 않으면 두 번째 방법은 7ms 걸립니다.

내가 놓친 것이 있습니까? 아니면 코드가 잘못 되었습니까?

답변

0

이 시도 :

SqlDataReader reader = cmd.ExecuteReader(); 
DataTable dt = new DataTable();   
dt.Load(reader);    
ds.Tables.Add(dt); 
+0

코드는가 ExecuteReader의 결과 때문에 위의 한 (같은이어야한다) 할 수있다 여러 테이블이 있습니다. 어쨌든 나는 너와 같이 해봤지만 그 결과는 똑같다. dt.Load()는 adapter.Fill()보다 훨씬 오래 걸린다. –

1

난 당신이 SqlDataAdapter::Fill(DataSet)를 사용하는 것이 좋습니다

DataSet ds = new DataSet(); 
ds.Clear(); 
SqlDataAdapter adapter = new SqlDataAdapter(); 
adapter.SelectCommand = cmd; 
adapter.Fill(ds); 
DataTable dt = ds.Tables[0]; 
관련 문제