http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3924|回复: 3

[C#语言基础] 比较两个DataTable数据(详细进来看)【太忙好久没有发了】

[复制链接]
发表于 2013-6-28 15:40:31 | 显示全部楼层 |阅读模式
本帖最后由 tangshun 于 2013-6-28 15:39 编辑

     功能介绍
     /// <summary>
       /// 比较两个DataTable数据(结构相同)
       /// </summary>
       /// <param name="dt1">DataTable</param>
       /// <param name="dt2">DataTable</param>
       /// <param name="keyField">关键字段名</param>
       /// <param name="dtRetAdd">新增数据(dt2中的数据)</param>
       /// <param name="dtRetDif1">不同的数据(数据库中的数据)</param>
       /// <param name="dtRetDif2">不同的数据(图2中的数据)</param>
       /// <param name="dtRetDel">删除的数据(dt2中的数据)</param>


[code=csharp]

      /// <summary>
       /// 比较两个DataTable数据(结构相同)
       /// </summary>
       /// <param name="dt1">DataTable</param>
       /// <param name="dt2">DataTable</param>
       /// <param name="keyField">关键字段名</param>
       /// <param name="dtRetAdd">新增数据(dt2中的数据)</param>
       /// <param name="dtRetDif1">不同的数据(数据库中的数据)</param>
       /// <param name="dtRetDif2">不同的数据(图2中的数据)</param>
       /// <param name="dtRetDel">删除的数据(dt2中的数据)</param>
       public static void CompareDt(DataTable dt1, DataTable dt2, string keyField,
           out DataTable dtRetAdd, out DataTable dtRetDif1, out DataTable dtRetDif2,
           out DataTable dtRetDel)
       {
           //为三个表拷贝表结构
           dtRetDel = dt1.Clone();
           dtRetAdd = dtRetDel.Clone();
           dtRetDif1 = dtRetDel.Clone();
           dtRetDif2 = dtRetDel.Clone();
           int colCount = dt1.Columns.Count;
           DataView dv1 = dt1.DefaultView;
           DataView dv2 = dt2.DefaultView;
           //先以第一个表为参照,看第二个表是修改了还是删除了
           foreach (DataRowView dr1 in dv1)
           {
               dv2.RowFilter = keyField + " = '" + dr1[keyField].ToString() + "'";
               if (dv2.Count > 0)
               {
                   if (!CompareUpdate(dr1, dv2[0]))//比较是否有不同的
                   {
                       dtRetDif1.Rows.Add(dr1.Row.ItemArray);//修改前
                       dtRetDif2.Rows.Add(dv2[0].Row.ItemArray);//修改后
                       dtRetDif2.Rows[dtRetDif2.Rows.Count - 1]["FID"] = dr1.Row["FID"];//将ID赋给来自文件的表,因为它的ID全部==0
                       continue;
                   }
               }
               else
               {
                   //已经被删除的
                   dtRetDel.Rows.Add(dr1.Row.ItemArray);
               }
           }
           //以第一个表为参照,看记录是否是新增的
           dv2.RowFilter = "";//清空条件
           foreach (DataRowView dr2 in dv2)
           {
               dv1.RowFilter = keyField + " = '" + dr2[keyField].ToString() + "'";
               if (dv1.Count == 0)
               {
                   //新增的
                   dtRetAdd.Rows.Add(dr2.Row.ItemArray);
               }
           }
       }
       //比较是否有不同的
       private static bool CompareUpdate(DataRowView dr1, DataRowView dr2)
       {
           //行里只要有一项不一样,整个行就不一样,无需比较其它
           object val1;
           object val2;
           for (int i = 1; i < dr1.Row.ItemArray.Length; i++)
           {
               val1 = dr1;
               val2 = dr2;
               if (!val1.Equals(val2))
               {
                   return false;
               }
           }
           return true;
       }

[/code]




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-6-28 15:42:41 | 显示全部楼层
建议楼主出个Linq版的
 楼主| 发表于 2013-6-28 15:44:58 | 显示全部楼层
站长苏飞 发表于 2013-6-28 15:42
建议楼主出个Linq版的

这个没有问题
发表于 2013-6-28 19:50:51 | 显示全部楼层
LINQ的话,会很不错
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-17 17:59

© 2014-2021

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