天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 63|回复: 0

比较两个DataTable数据(结构相同),返回新增的,删除的,修改前的,修改后的 DataTab

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
  1. /// <summary>
  2.         /// 比较两个DataTable数据(结构相同)
  3.         /// </summary>
  4.         /// <param name="dt1">来自数据库的DataTable</param>
  5.         /// <param name="dt2">来自文件的DataTable</param>
  6.         /// <param name="keyField">关键字段名</param>
  7.         /// <param name="dtRetAdd">新增数据(dt2中的数据)</param>
  8.         /// <param name="dtRetDif1">不同的数据(数据库中的数据)</param>
  9.         /// <param name="dtRetDif2">不同的数据(图2中的数据)</param>
  10.         /// <param name="dtRetDel">删除的数据(dt2中的数据)</param>
  11.         public static void CompareDt(DataTable dt1, DataTable dt2, string keyField,
  12.             out DataTable dtRetAdd, out DataTable dtRetDif1, out DataTable dtRetDif2,
  13.             out DataTable dtRetDel)
  14.         {
  15.             //为三个表拷贝表结构
  16.             dtRetDel = dt1.Clone();
  17.             dtRetAdd = dtRetDel.Clone();
  18.             dtRetDif1 = dtRetDel.Clone();
  19.             dtRetDif2 = dtRetDel.Clone();
  20.             int colCount = dt1.Columns.Count;
  21.             DataView dv1 = dt1.DefaultView;
  22.             DataView dv2 = dt2.DefaultView;
  23.             //先以第一个表为参照,看第二个表是修改了还是删除了
  24.             foreach (DataRowView dr1 in dv1)
  25.             {
  26.                 dv2.RowFilter = keyField + " = '" + dr1[keyField].ToString() + "'";
  27.                 if (dv2.Count > 0)
  28.                 {
  29.                     if (!CompareUpdate(dr1, dv2[0]))//比较是否有不同的
  30.                     {
  31.                         dtRetDif1.Rows.Add(dr1.Row.ItemArray);//修改前
  32.                         dtRetDif2.Rows.Add(dv2[0].Row.ItemArray);//修改后
  33.                         dtRetDif2.Rows[dtRetDif2.Rows.Count - 1]["FID"] = dr1.Row["FID"];//将ID赋给来自文件的表,因为它的ID全部==0
  34.                         continue;
  35.                     }
  36.                 }
  37.                 else
  38.                 {
  39.                     //已经被删除的
  40.                     dtRetDel.Rows.Add(dr1.Row.ItemArray);
  41.                 }
  42.             }
  43.             //以第一个表为参照,看记录是否是新增的
  44.             dv2.RowFilter = "";//清空条件
  45.             foreach (DataRowView dr2 in dv2)
  46.             {
  47.                 dv1.RowFilter = keyField + " = '" + dr2[keyField].ToString() + "'";
  48.                 if (dv1.Count == 0)
  49.                 {
  50.                     //新增的
  51.                     dtRetAdd.Rows.Add(dr2.Row.ItemArray);
  52.                 }
  53.             }
  54.         }
  55.         //比较是否有不同的
  56.         private static bool CompareUpdate(DataRowView dr1, DataRowView dr2)
  57.         {
  58.             //行里只要有一项不一样,整个行就不一样,无需比较其它
  59.             object val1;
  60.             object val2;
  61.             for (int i = 1; i < dr1.Row.ItemArray.Length; i++)
  62.             {
  63.                 val1 = dr1[i];
  64.                 val2 = dr2[i];
  65.                 if (!val1.Equals(val2))
  66.                 {
  67.                     return false;
  68.                 }
  69.             }
  70.             return true;
  71.         }
复制代码

 

 

 

 

比较两个DataTable数据(结构相同),返回新增的,删除的,修改前的,修改后的 DataTab
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-10-18 13:29 , Processed in 0.242372 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表