2014-10-28 4 views
0

데이터베이스 서버가 다른 위치에 있고 연결 속도가 느리기 때문에 레코드를 가져와야 할 때가 있습니다. 레코드를 가져 오는 데 약간의 시간이 걸리므로 레코드가 얼마나 많이 다운로드되었는지 알고 싶습니다. .데이터 테이블 채우기 진행 진행

public DataTable fillMyDataTable(string sQuery) 
    { 

     SqlDataAdapter myDataAdapter; 
     SqlCommandBuilder mySqlCommandBuilder; 
     DataTable dataTable; 

     myDataAdapter = new SqlDataAdapter(sQuery, this.connection); 
     mySqlCommandBuilder = new SqlCommandBuilder(mySqlDataAdapter); 
     myDataAdapter.SelectCommand.CommandTimeout = 240; 

     dataTable = new DataTable(); 
     mySqlDataAdapter.Fill(dataTable); 

     return dataTable; 
    } 

이 난 이상에서 메소드를 호출하는 방법이다 :

는 데이터 테이블 작성 방법이다 DataTable에 DT = DataTable의 새로운();

private void FillData() 
{ 
     string sql = "SELECT Id, Code, Desc FROM myTable"; 
     dt.RowChanged += new DataRowChangeEventHandler(this.dt_RowChanged); 
     dt = fillMyDataTable(sql); 
     dt.AcceptChanges(); 
} 

void dt_RowChanged(object sender, DataRowChangeEventArgs e) 
{ 
    if (e.Action == DataRowAction.Add) 
    { 
     Console.WriteLine("Current no. of rec.: " + dt.Rows.Count.ToString()); 
    } 
} 

출력은 1904 개의 2100 레코드와 같아야합니다. 문제는 dt_RowChanged 이벤트가 발생하지 않는다는 것입니다. 그렇게하는 방법?

업데이트! 위의 코드는 dt_RowChanged 이벤트가 발생할 때까지 작동하며 dt 객체도 레코드로 채워집니다.

+0

어때'dt.Rows.Count' – artm

답변

0

그래서 가져온 레코드 수를 계산 하시겠습니까?

int countFetched = dt.Rows.Count; 
+0

어쨌든 "실시간"으로 계산하고 싶다고합시다. 때로는 레코드를 가져 오는 것은 서버 가용성 및 가져온 레코드 수에 따라 몇 초 또는 몇 분 동안 앱을 차단하는 경우가 있으며 앱이 차단 된 시점은 언제입니까? 나는 그것을 피하고 싶다. – Josef

+0

당신은 또한 count (iD) from myTable 같은 select SQL에서 처음으로 계산할 수 있습니다. 그건 그다지 가져 오기 시간이 많이 걸리지 않습니다. – Koen

+0

이미 완료했습니다. 나는 배경 작업자를 사용해야한다고 생각하니? – Josef

1

이벤트를 발생 시키려면 다음을 시도하십시오. 이벤트에 적절한 대리인을 사용하지 않는 경우.

private void FillData() 
{ 
     string sql = "SELECT Id, Code, Desc FROM myTable"; 
     dt = fillMyDataTable(sql); 
     DataRowChangeEventArgs args = new DataRowChangeEventArgs (dt.Rows, dt.RowState); 
     dt_RowChanged(this, args); 

} 

업데이트

난 그냥 당신이 이벤트 dt_RowChanged declatre 일부러 발견 당신은 그것을 발사했다. 어쨌든 당신의 잘못이 아닐까요? 다시 확인하십시오. 모든

int iCurrentCount = 0; 
int iTotalNumOfRec = 0; 


iTotalNumOfRec = getNumOfRec("SELECT COUNT(*) FROM myTable) 

dt = fillMyDataTable(sql);   
int i = 0; 

     while (i < iTotlNumOfRec) 
     { 
      DataRowChangeEventArgs args = new DataRowChangeEventArgs(dt.Rows[i], DataRowAction.Add); 
      dt_RowChanged(this, args); 
      ++i; 
     } 

    void dt_RowChanged(object sender, DataRowChangeEventArgs e) 
    { 
      if (e.Action == DataRowAction.Add) 
      {    
       Console.WriteLine("Current rec. no.: " + iCurrentCount.ToString()); 
       iCurrentCount++; 
      } 
     } 

가 감사 :

dt.RowChanged += new DataRowChangeEventHandler(this.dt_RowChanged); 
+0

네 번째 줄에 오류가 있습니다. 오류 'System.Data.DataRowChangeEventArgs'에 1 개의 인수를 사용하는 생성자가 없습니다. – Josef

+0

위와 동일하게 전달하십시오. 만약 실패하면 당신은 대의원을 사용할 수 있습니다. 또는 실패 할 경우 알려 주시면 나중에 무료로 업데이트되고 테스트됩니다. –

+0

내 업데이트 참조 .. –

0

나는이 현재 나의 솔루션, 내가 그것을 만들었다 고 생각!