2012-04-04 84 views
1

我從一個表中的sqlite3的數據庫使用下面落實SQLite數據庫進度條讀取C#

代碼目前我限制只記錄200顯示爲顯示所有這些數據讀入一個ListView太長了。 (有些30000條記錄)

我想給顯示所有記錄的選項,如果選擇該選項,能夠加載每個記錄。

正如我所說,它需要相當長的時間,我想用一個進度條來顯示它的狀態。

我從來沒有使用過進度條,所以我不知道它們是如何工作的。是否會在我的代碼中添加一些額外的代碼行以允許使用進度條,還是需要對其進行線程化並使用後臺工作程序?

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

您正在運行您的查詢兩次,您不需要此行command.ExecuteNonQuery();. dataAdaptor.Fill(dataset,「dataset_name」);將運行查詢 – Jmyster 2012-04-04 17:42:51

+0

@Jmyster感謝您指出了這一點 – Daniel 2012-04-04 17:52:37

回答

1

標識的使用數據視圖,所以我可以得到我需要使用RowStateFilter的記錄數。然後用foreach而不是for語句遍歷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 2012-04-04 18:24:16

+0

如果它工作正常,那麼你很好=)很高興我能幫上忙 – Jmyster 2012-04-04 18:27:05

1

用於顯示和更新進度條,你必須設置Maximum然後Increment方法,只要你喜歡,以顯示進度。這意味着要在需要的地方添加代碼。您可以設置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); 

你可以得到很多samples from internet like so

+0

這實際上是爲我工作,但如果我想讓它在完成看不見它似乎從來就沒進度條的最後變得不可見 你就會知道之前爲什麼這是? – Daniel 2012-04-04 18:14:07

+0

所以你仍然有問題? – ata 2012-04-04 18:49:04

+0

不,一切都很好,謝謝你的幫助 – Daniel 2012-04-04 18:56:40