C#批量增量更新数据

方法一:建立临时表进行数据更新和插入

Step1 创建临时表

/// <summary>
/// 创建临时表存储当前需要提交的数据
/// </summary>
/// <param name="databaseConnectionString">数据库连接字符串</param>
/// <param name="tableName">当前更新导入的表名</param>
/// <returns></returns>
public static string CreateTempTable(string databaseConnectionString, string tableName)
{
   
    string tempTableName = string.Empty;
    string sql = string.Empty;
    //创建临时表存储当前需要提交的数据
    for (int i = 0; i < 20; i++)  //只是设定一个临时表的序号,如果是多台主机导入同一个数据库的时候,在数据库中可能会创建同名的临时表
    {
   
        sql = string.Format("SELECT * INTO {0} FROM {1} where 1=2", tableName + "_TEMP" + i, tableName);
        try
        {
   
            ExecuteQuery(sql, databaseConnectionString);
            tempTableName = tableName + "_TEMP" + i;
            break;
        }
        catch //如果在创建当前的临时表的过程中发生了错误,如当前临时表已经存在或者被占用,则继续通过 序号i去创建下一张临时表,直到创建成功为止
        {
   
            continue;
        }
    }
    return tempTableName;
}

Step2 临时表和数据库数据进行对比,提取数据库表中不存在的数据,然后插入当前数据库表中不存在的数据

/// <summary>
/// 将临时表和当前需要更新的表的数据进行对比,根据表内的唯一标识提取出在当前表中不存在的数据,然后批量插入新增的数据
/// </summary>
/// <param name="databaseConnectionString">数据库连接字符串</param>
/// /// <param name="dt">更新需要提交数据的datatable</param>
/// <param name="tableName">当前更新导入的表名</param>
/// <param name="tempTableName">临时表表名</param>
/// <returns></returns>
public static string GetUpdateData(string databaseConnectionString, DataTable dt, string tableName, string tempTableName)
{
   
    string errMess = string.Empty;
    try
    {
   
        string sql = string.Empty;
        string found = string.Empty;
        List<string> keyList = new List<string>();
        //提取需要批量插入的数据的唯一标识列表
        sql = string.Format("select key from {0}  except select key from {1}", tempTableName, tableName);
        found = string.Format("key= '{0}'", "@key");  //生成在当前的datatable查找的语句,key为查找的关键字,当前使用@key来代替所需的关键字
        #region 批量插入数据库中不存在的数据

        keyList = new List<string>();  //用于存储当前查询的唯一标识中在临时表中存在而在数据库表中不存在的数据列表
        keyList = GetSqlAsString(sql, null, databaseConnectionString);
        DataTable appendData = dt.Clone();
        for (int i = 0; i < keyList.Count; i++)
        {
   
            DataRow[] dr = dt.Select(found.Replace("@key", keyList[i]));
            foreach (var row in dr)
            {
   
                appendData.ImportRow(row);
            }
        }
        SqlBulkCopyByDatatable(databaseConnectionString, tableName, appendData);
        #endregion
        return errMess;
    }
    catch (Exception ex)
    {
   
        errMess = ex.Message;
        return errMess;
    }
}

Step3 根据临时表更新当前导入表的数据

/// <summary>
/// 根据临时表更新当前导入表的数据
/// </summary>
/// <param name="databaseConnectionString">数据库连接字符串</param>
/// <param name="tableName">当前更新导入的表名</param>
/// <pa
### 如何在C#更新ListView控件的数据 为了有效地更新`ListView`控件中的数据,在C#编程环境中通常会采用几种方法来实现这一目标。下面提供了一种常见的方式,即通过清空当前项并重新填充新的项目集合。 #### 清除现有条目并添加新条目 可以通过先清除所有的Item再逐个加入新的Items的方式来刷新整个列表视图的内容: ```csharp // 假设有一个名为 listView1 的 ListView 控制实例已经存在于窗体上 listView1.Items.Clear(); // 移除所有现有的 Items foreach (var item in newDataCollection) { ListViewItem lvi = new ListViewItem(item.ToString()); listView1.Items.Add(lvi); } ``` 这种方法简单直接,适用于大多数场景下的基本需求[^1]。 #### 利用虚拟模式提高性能 对于非常大的数据集来说,频繁地调用`Clear()`批量插入可能会导致界面响应变慢。此时可以考虑启用`VirtualMode`特性,并设置相应的事件处理程序以便按需加载数据: ```csharp listView1.VirtualMode = true; listView1.RetrieveVirtualItem += OnRetrieveVirtualItem; private void OnRetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e){ if(e.ItemIndex >= dataList.Count || e.ItemIndex < 0) return ; string text = dataList[e.ItemIndex].ToString(); e.Item = new ListViewItem(text); } ``` 这里的关键在于订阅了`RetrieveVirtualItem`事件,每当需要展示特定索引位置上的item时就会触发该回调函数[^2]。 #### 实现增量更新 如果只需要部分修改而不是全部替换,则可以选择定位到具体的子项进行单独操作。比如要更改某个指定index处的文本内容可这样做: ```csharp if(index>=0 && index<listView1.Items.Count){ listView1.Items[index].Text = newText; } ``` 这种方式允许更细粒度地控制哪些地方发生了变化而无需重绘整个区域[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值