天气与日历 切换到窄版

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

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

[复制链接]
  • TA的每日心情
    开心
    2024-8-31 15:58
  • 签到天数: 89 天

    [LV.6]常住居民II

    488

    主题

    207

    回帖

    3366

    积分

    管理员

    积分
    3366
    发表于 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-9-8 09:15 , Processed in 0.067239 second(s), 27 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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