2012-04-04 2 views
1

내가 그들 모두를 표시하는 것과 같은 난 단지 (200)를 표시 할 레코드를 제한하고있는 순간는 SQLite 데이터베이스에 진행 표시 줄이 C#

아래의 코드를 사용하여 ListView에 내로 sqlite3를 데이터베이스에 테이블에서 데이터를 읽고 있습니다 읽어 구현 너무 오래 걸립니다. (약 30,000 레코드)

모든 레코드를 표시하고 모든 레코드를로드 할 수 있도록 옵션을 선택하면 옵션을 제공하고 싶습니다.

시간이 오래 걸리며 진행 상태 표시 줄을 사용하여 상태를 표시하고 싶습니다.

진행률 표시 줄을 사용한 적이 없으므로 어떻게 작동하는지 알 수 없습니다. 진행 막대를 사용할 수 있도록 코드에 몇 줄의 코드를 추가하는 것이 좋을까요 아니면 스레드를 사용해야하고 배경 작업자를 사용해야할까요?

private void cmdReadDatabase_Click(object sender, EventArgs e) 
{ 
    listView4.Columns.Add("Row1", 50); 
    listView4.Columns.Add("Row2", 50); 
    listView4.Columns.Add("Row3", 50); 
    listView4.Columns.Add("Row4", 50); 
    listView4.Columns.Add("Row5", 50); 
    listView4.Columns.Add("Row6", 50); 
    listView4.Columns.Add("Row7", 50); 

    try 
    { 
     string connectionPath = Path.Combine(@"C:\", @"temp\"); 

     SQLiteConnectionStringBuilder csb = new SQLiteConnectionStringBuilder(); 
     csb.DataSource = Path.Combine(connectionPath, "database.db"); 

     SQLiteConnection connection = new SQLiteConnection(csb.ConnectionString); 
     connection.Open(); 

     // Query to read the data 
     SQLiteCommand command = connection.CreateCommand(); 
     string query = "SELECT * FROM table_name LIMIT 200 "; 
     command.CommandText = query; 
     command.ExecuteNonQuery(); 

     SQLiteDataAdapter dataAdaptor = new SQLiteDataAdapter(command); 
     DataSet dataset = new DataSet(); 
     dataAdaptor.Fill(dataset, "dataset_name"); 

     // Get the table from the data set 
     DataTable datatable = dataset.Tables["dataset_name"]; 
     listView4.Items.Clear(); 

     // Display items in the ListView control 
     for (int i = 0; i < datatable.Rows.Count; i++) 
     { 
      DataRow datarow = datatable.Rows[i]; 
      if (datarow.RowState != DataRowState.Deleted) 
      { 
       // Define the list items 
       ListViewItem lvi = new ListViewItem(datarow["Row1"].ToString()); 
       lvi.SubItems.Add(datarow["Row2"].ToString()); 
       lvi.SubItems.Add(datarow["Row3"].ToString()); 
       lvi.SubItems.Add(datarow["Row4"].ToString()); 
       lvi.SubItems.Add(datarow["Row5"].ToString()); 
       lvi.SubItems.Add(datarow["Row6"].ToString()); 
       lvi.SubItems.Add(datarow["Row7"].ToString()); 

       // Add the list items to the ListView 
       listView4.Items.Add(lvi); 
      } 
     } 
     connection.Close(); 
    } 
    catch(SQLiteException ex) 
    { 
     MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK); 
    } 
} 
+1

쿼리를 두 번 실행 중이므로이 줄 명령은 필요하지 않습니다 .ExecuteNonQuery() ;. dataAdaptor.Fill (dataset, "dataset_name"); 쿼리를 실행합니다 – Jmyster

+0

@Jmyster 그 점을 지적 해 주셔서 감사합니다 – Daniel

답변

1

아이디를 많이 얻을 수 있습니다. 그런 다음 for 문 대신 foreach를 사용하여 DataView를 반복합니다.

 ProgressBar _Bar = new ProgressBar(); 

     DataView _View = new DataView(); 
     _View.Table = datatable; 
     _View.RowStateFilter = DataViewRowState.CurrentRows; 

     _Bar.Minimum = 0; 
     _Bar.Maximum = _View.ToTable().Rows.Count; 

     foreach (DataRow datarow in _View.ToTable().Rows) 
     { 
      // Define the list items  
      ListViewItem lvi = new ListViewItem(datarow["Row1"].ToString()); 
      lvi.SubItems.Add(datarow["Row2"].ToString()); 
      lvi.SubItems.Add(datarow["Row3"].ToString()); 
      lvi.SubItems.Add(datarow["Row4"].ToString()); 
      lvi.SubItems.Add(datarow["Row5"].ToString()); 
      lvi.SubItems.Add(datarow["Row6"].ToString()); 
      lvi.SubItems.Add(datarow["Row7"].ToString()); 

      // Add the list items to the ListView  
      listView4.Items.Add(lvi); 
      _Bar.PerformStep(); 
     } 

다음 incraments 진행 표시 줄 :

_Bar.PerformStep(); 

이 코드를 실행하지 않고는 당신이 당신이 생각처럼 진행 막대가 실제로 업데이트에 문제가있을 것이다 생각한다. 프로세스가 UI 스레드에서 실행 중이므로 UI가 업데이트되지 못하도록 차단합니다. 다른 스레드에서이 프로세스를 실행하는 것이 좋습니다. 그것은 완전히 다른 주제입니다.

+0

이것은 훌륭하게 작동합니다. 스레딩하는 것이 좋습니다. 또는 그대로 두십시오. – Daniel

+0

잘 작동하면 좋다 =) 다행히 도울 수 있습니다. – Jmyster

1

표시 및 진행률 표시 줄을 업데이트하는 경우, 당신은 진행 상황을 보여 원할 때 Increment 방법을 Maximum을 설정해야합니다. 이는 원하는 곳에 증분 코드를 추가하는 것을 의미합니다. Value 속성을 설정하거나 Increment 기능을 사용할 수 있습니다.

진행률 표시 줄을 업데이트하려면 다른 컨트롤과 마찬가지로 진행률 표시 줄의 부모 스레드에 위임해야합니다.

간단한 예는 다음과 같습니다

progressBar.Maximum = 200; //you have 200 records 
//after retrieving one record, and adding it to list you can do 
//you may have to Invoke it on creating thread if InvokeRequired. 
progressBar.Increment(1); 

당신은 그래서 내가 RowStateFilter를 사용하여 원하는 레코드 수를 얻을 수있는 DataView를를 사용 samples from internet like so

+0

실제로 작동하고 있습니다. 그러나 완료되면 보이지 않게하려면 보이지 않게되기 전에 진행률 막대의 맨 끝 부분에 도달하지 않는 것 같습니다. 알고 싶습니까? 왜 이래? – Daniel

+0

그래도 문제가 있습니까? – ata

+0

아니요, 모든 것이 다 잘되었습니다. 도움을 주셔서 감사합니다. – Daniel

관련 문제