在SQLite数据库读取C#上实现进度条
本文关键字:实现 SQLite 数据库 读取 | 更新日期: 2023-09-27 18:30:13
我正在使用下面的代码将SQLite3数据库中的表中的数据读取到ListView中
目前,我将记录限制为仅显示200条,因为显示所有记录的时间太长了。(约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);
}
}
Id使用DataView,这样我就可以使用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();
}
以下内容增加了进度条:
_Bar.PerformStep();
如果不运行此代码,我怀疑Progressbar实际上会像您认为的那样更新,您会遇到问题。您的进程正在UI线程上运行,因此它将阻止UI更新。您可能需要研究在另一个线程上运行此进程。这是另一个话题。
为了显示和更新进度条,您必须随时设置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);
你可以从互联网上获得很多样本,比如