You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms中跨库DataTable合并及数据替换技术问询

嘿,我来帮你搞定这个跨数据库DataTable的合并与数据替换问题!根据你的需求,我整理了两种最常用的实现方案,你可以根据实际场景选择:

方案1:直接替换dtDetails中的pNameLocal字段

如果你的需求是把dtDetails里的pNameLocal替换成dtProduct中对应code的pNameOrignal,用字典缓存的方式效率最高(尤其是数据量大的时候),步骤如下:

  1. 先把dtProduct的code和pNameOrignal映射到字典,避免每次查找都遍历整个表
  2. 遍历dtDetails的每一行,根据code匹配替换字段
// 注意:这里的code类型要和你的DataTable一致,如果是int就改成int
var productMap = dtProduct.AsEnumerable()
    .ToDictionary(
        row => row.Field<string>("code"), 
        row => row.Field<string>("pNameOrignal")
    );

// 遍历dtDetails替换数据
foreach (DataRow detailRow in dtDetails.Rows)
{
    string currentCode = detailRow.Field<string>("code");
    if (productMap.ContainsKey(currentCode))
    {
        // 替换为原始产品名称
        detailRow["pNameLocal"] = productMap[currentCode];
    }
    // 可选:处理没有匹配到的code
    // else
    // {
    //     detailRow["pNameLocal"] = "未找到对应产品";
    // }
}

方案2:创建全新的合并DataTable

如果需要生成一个包含两个表所有关键字段的新表,而不是修改原表,可以用这个方法:

// 创建新的合并表,定义需要的列(根据你的需求调整字段和类型)
DataTable mergedTable = new DataTable("MergedProductDetails");
mergedTable.Columns.Add("id", typeof(int));
mergedTable.Columns.Add("tid", typeof(int));
mergedTable.Columns.Add("code", typeof(string));
mergedTable.Columns.Add("pNameOriginal", typeof(string));
mergedTable.Columns.Add("qty", typeof(int));
mergedTable.Columns.Add("price", typeof(decimal));

// 同样先创建字典缓存产品映射
var productMap = dtProduct.AsEnumerable()
    .ToDictionary(
        row => row.Field<string>("code"), 
        row => row.Field<string>("pNameOrignal")
    );

// 填充合并表
foreach (DataRow detailRow in dtDetails.Rows)
{
    DataRow newRow = mergedTable.NewRow();
    newRow["id"] = detailRow.Field<int>("id");
    newRow["tid"] = detailRow.Field<int>("tid");
    newRow["code"] = detailRow.Field<string>("code");
    
    // 关联原始产品名称
    string currentCode = detailRow.Field<string>("code");
    newRow["pNameOriginal"] = productMap.ContainsKey(currentCode) 
        ? productMap[currentCode] 
        : "无匹配产品";
    
    newRow["qty"] = detailRow.Field<int>("qty");
    newRow["price"] = detailRow.Field<decimal>("price");
    
    mergedTable.Rows.Add(newRow);
}

// 之后就可以把mergedTable绑定到DataGridView或者其他控件了

注意事项

  • 数据类型匹配:一定要确保code字段在两个表中的数据类型一致(比如都是string或者都是int),否则Field<T>会抛出类型转换异常
  • 性能优化:用字典缓存映射比每次用dtProduct.Select($"code='{currentCode}'")查找快得多,尤其是当数据量超过几百条的时候
  • 异常处理:如果存在code重复的情况,ToDictionary会抛出异常,这时候可以用ToLookup来处理多匹配的场景

内容的提问来源于stack exchange,提问作者Abdul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:17:40