C# WinForms中跨库DataTable合并及数据替换技术问询
嘿,我来帮你搞定这个跨数据库DataTable的合并与数据替换问题!根据你的需求,我整理了两种最常用的实现方案,你可以根据实际场景选择:
方案1:直接替换dtDetails中的pNameLocal字段
如果你的需求是把dtDetails里的pNameLocal替换成dtProduct中对应code的pNameOrignal,用字典缓存的方式效率最高(尤其是数据量大的时候),步骤如下:
- 先把dtProduct的
code和pNameOrignal映射到字典,避免每次查找都遍历整个表 - 遍历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
相关产品推荐
相关产品推荐

