2012-04-04 85 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