当前位置: 首页 > 知识库问答 >
问题:

c# - C# Winform 编程中实现 SQLite3 数据库批量更新与进度条联动?

江礼骞
2024-03-10

C# Winform编程 连接sqlite3 进行批量更新 想把方法抽出进行解耦

            public void update(string DBsource, List<string>sqls){            string source = "Data Source= " + DBsource;            using SqliteConnection sqliteConn = new(source);            try            {                sqliteConn.Open();                progressBar1.Value = 0;                progressBar1.Maximum = sqls.Count;                progressBar1.Visible = true;                foreach (var item in sqls)                {                    SqliteCommand cmd = new(item, sqliteConn);                    cmd.Prepare();                    cmd.ExecuteNonQuery();                    progressBar1.Value++;                }            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }            finally { sqliteConn.Close(); }}

但有对进度条的控制内容
如何让进度中每一个更新,能够转递给外部的控件 progressBar1

共有1个答案

景康安
2024-03-10

在C# WinForms中,为了实现SQLite3数据库的批量更新并与进度条联动,你需要将进度更新的逻辑抽取到一个单独的方法中,并通过事件或委托来通知外部控件更新进度条的值。这样,你就可以在调用更新方法时,同时更新UI控件。

下面是一个示例,展示了如何实现这一点:

首先,定义一个委托,用于通知更新进度条的值:

public delegate void ProgressUpdateDelegate(int value);

然后,在更新方法中添加一个事件,当每次执行SQL语句后触发这个事件:

public class DatabaseUpdater{    public event ProgressUpdateDelegate ProgressUpdated;    public void Update(string DBsource, List<string> sqls)    {        string source = "Data Source=" + DBsource;        using SqliteConnection sqliteConn = new(source);        try        {            sqliteConn.Open();            int totalCount = sqls.Count;            ProgressBarUpdateHelper.Maximum = totalCount;            ProgressBarUpdateHelper.Value = 0;            ProgressBarUpdateHelper.Visible = true;                        foreach (var item in sqls)            {                SqliteCommand cmd = new(item, sqliteConn);                cmd.Prepare();                cmd.ExecuteNonQuery();                // 触发事件更新进度条                OnProgressUpdated(1); // 假设每次增加1            }        }        catch (Exception ex)        {            MessageBox.Show(ex.Message);        }        finally        {            sqliteConn.Close();        }    }    protected virtual void OnProgressUpdated(int value)    {        ProgressUpdated?.Invoke(value);    }}

在WinForms应用程序中,你需要一个方法来接收这个事件并更新进度条。这通常在你的主窗体类中完成:

public partial class MainForm : Form{    private DatabaseUpdater databaseUpdater;    public MainForm()    {        InitializeComponent();        databaseUpdater = new DatabaseUpdater();        databaseUpdater.ProgressUpdated += DatabaseUpdater_ProgressUpdated;    }    private void DatabaseUpdater_ProgressUpdated(int value)    {        // 更新UI,因此需要在控件线程中执行        if (progressBar1.InvokeRequired)        {            progressBar1.Invoke(new ProgressUpdateDelegate(progressBar1.Value = value));        }        else        {            progressBar1.Value = value;        }    }    private void StartUpdatesButton_Click(object sender, EventArgs e)    {        // 假设你有一个列表sqls包含所有的SQL语句        List<string> sqls = ...;        databaseUpdater.Update("path_to_your_db", sqls);    }}

在上面的代码中,MainForm 类订阅了 DatabaseUpdater 类的 ProgressUpdated 事件,并在事件处理器 DatabaseUpdater_ProgressUpdated 中更新了进度条的值。使用 InvokeRequiredInvoke 方法确保了UI更新在正确的线程上执行。

当你调用 StartUpdatesButton_Click 方法(可能是一个按钮的点击事件)时,它会启动批量更新过程,并且每次更新都会触发 ProgressUpdated 事件,从而更新UI中的进度条。

 类似资料:
  • 本文向大家介绍C# Oracle批量插入数据进度条的实现代码,包括了C# Oracle批量插入数据进度条的实现代码的使用技巧和注意事项,需要的朋友参考一下 前言 由于项目需求,需要将Excel中的数据进过一定转换导入仅Oracle数据库中。考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需

  • 本文向大家介绍c# Winform 程序自动更新实现方法,包括了c# Winform 程序自动更新实现方法的使用技巧和注意事项,需要的朋友参考一下 Winform程序自动更新我也是第一次做,网上找了自动更新的源码,后来又根据在网上看到的一些方法,自己试了很久,最终还是有写错误,所以花了钱让别人帮忙调试成功的,下面是我自己捣腾出来的,方便大家借鉴,如果有什么错误的地方欢迎指正. 1、由于我是通过服务

  • 本文向大家介绍C#批量更新sql实例,包括了C#批量更新sql实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#批量更新sql的方法,分享给大家供大家参考。具体方法如下: 要实现批量更新Card数据,主要有以下步骤: 1、首先建立数据库连接 2、把部分数据填充到Dataset中 3、修改Dataset中数据的值 4、更新Dataset 5、循环操作,具体操作过程见下面代码: 希望本文

  • 本文向大家介绍php批量添加数据与批量更新数据的实现方法,包括了php批量添加数据与批量更新数据的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php批量添加数据与批量更新数据的实现方法。分享给大家供大家参考。具体分析如下: php如果要批量保存数据我们只要使用sql的insert into语句就可能实现数据批量保存了,如果是更新数据使用update set就可以完成更新了,操作

  • 问题内容: 我有一个具有主键和称为的列的270k行数据库,并且我有一个带有Mid和值的文本文件。现在,我想更新表,以便将每个值分配给正确的中间值。 我当前的方法是从C#中读取文本文件,并为读取的每一行更新表中的一行。必须有一种更快的方式来做我感觉到的事情..有什么想法吗? 编辑:表中还有其他列,所以我真的需要根据中点 更新 的方法。 问题答案: 您可以使用SQL Server导入和导出向导: ht

  • 本文向大家介绍C# Winform下载文件并显示进度条的实现代码,包括了C# Winform下载文件并显示进度条的实现代码的使用技巧和注意事项,需要的朋友参考一下 方法一: 效果如下图所示: 代码如下: 实现方法二: WinForm下载文件并显示下载进度示例