内容不写了,代码上都做了写注释。

1   /**//// <summary>
  2        /// 比较两个数据表,并返回比较结果表
  3        /// 比较条件:
  4        /// 1.两个表结构相同;
  5        /// 2.两个表排序都是按主键顺序排序;
  6        /// 3.两个表都不为空;
  7        /// </summary>
  8        /// <param name="newTable">新数据</param>
  9        /// <param name="oldTable">旧数据</param>
 10        /// <param name="parmaryKey">表主键名称</param>
 11        /// <param name="colState">状态列名称</param>
 12        /// <param name="stateValue">不相同时状态值</param>
 13        /// <returns>结果数据表  </returns>
 14        public static DataTable CompareData(
 15            this DataTable newTable,
 16            DataTable oldTable,
 17            string parmaryKey,
 18            string colState,
 19            object stateValue)
 20        {
 21            int newTableCount = newTable.Rows.Count;
 22            int oldTableCount = oldTable.Rows.Count;
 23
 24            /**/////比较结果表
 25            DataTable resultTable = newTable.Clone();
 26
 27            int i = 0, j = 0;
 28            do
 29            {
 30                DataRow dr1 = null;
 31                DataRow dr2 = null;
 32
 33                /**/////结果行
 34                DataRow rDr = resultTable.NewRow();
 35
 36                /**/////如果超出旧表,则新表所有其他列进行添加
 37                if (j < oldTableCount)
 38                {
 39                    dr2 = oldTable.Rows[j];
 40                }
 41                else
 42                {
 43                    for (int k = i; k < newTableCount; k++)
 44                    {
 45                        DataRow rDr2 = resultTable.NewRow();
 46                        rDr2.ItemArray = newTable.Rows[k].ItemArray;
 47                        resultTable.Rows.Add(rDr2);
 48                    }
 49                    /**/////添加完成后退出
 50                    break;
 51                }
 52
 53                /**/////如果超出新表,则将旧表剩余数据设置状态值并添加到结果表中
 54                if (i < newTableCount)
 55                {
 56                    dr1 = newTable.Rows[i];
 57                }
 58                else
 59                {
 60                    for (int k = j; k < oldTableCount; k++)
 61                    {
 62                        DataRow rDr2 = resultTable.NewRow();
 63                        rDr2.ItemArray = oldTable.Rows[k].ItemArray;
 64                        rDr2[colState] = stateValue;
 65                        resultTable.Rows.Add(rDr2);
 66                    }
 67                    /**/////添加完成后退出
 68                    break;
 69                }
 70
 71                int result = string.Compare(dr1[parmaryKey].ToString(), dr2[parmaryKey].ToString(), true);
 72
 73                switch (result)
 74                {
 75                    /**/////新表小于则移动新表
 76                    case -1:
 77                        i++;
 78                        rDr.ItemArray = dr1.ItemArray;
 79                        resultTable.Rows.Add(rDr);
 80                        break;
 81
 82                    /**/////相同加入结果,两个表同时向下移动
 83                    case 0:
 84                        i++; j++;
 85                        rDr.ItemArray = dr1.ItemArray;
 86                        resultTable.Rows.Add(rDr);
 87                        break;
 88
 89                    /**/////新表大于则移动旧表
 90                    case 1:
 91                        j++;
 92                        rDr.ItemArray = dr2.ItemArray;
 93                        rDr[colState] = stateValue;
 94                        resultTable.Rows.Add(rDr);
 95                        break;
 96
 97                }
 98            } while (i <= newTableCount);
 99
100            return resultTable;}

比较DataTable中新旧数据的更多相关文章

  1. 去除DataTable中的重复数据

    有时需要从DataTable中抽取Distinct数据,遍历比较费劲,C#.NET中其实有更易用的方法,如下: string[] columnArray = { "columnName1&q ...

  2. 【转载】C#如何往DataTable中新增一个数据列

    在C#中的Datatable数据变量的操作过程中,有时候我们需要往现有的DataTable中新增一个自定义数据列,该列在原有的DataTable变量中并不存在,属于用户手工自定义新增的数据列,在往Da ...

  3. 如何删除datatable中的一行数据

    在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(ind ...

  4. 从 vCenter Server 使用的数据库中清除旧数据 (2075138)(转)

    Document Id 2075138 Symptoms 免责声明: 本文为 Purging old data from the database used by VMware vCenter Ser ...

  5. 关于C#读取MySql数据时,返回DataTable中某字段数据是System.Array[]形式

    我在使用C#(VS2008)读取MySql数据库(5.1版本)时,返回的DataTable数据中arrivalDate字段数据显示为System.Array[]形式(程序中没有对返回的数据进行任何加工 ...

  6. Linux中“新旧”TCP/IP工具的对比

    如今很多系统管理员依然通过组合使用诸如ifconfig.route.arp和netstat等命令行工具(统称为net-tools)来配置网络功能.解决网络故障,net-tools起源于BSD的TCP/ ...

  7. DataTable 怎样设置列宽? DataTable中已经有数据了怎样在现实的时候设置它的列宽?

    首先要理解 DataTable是一个虚拟表,里面存有数据列,既然是虚拟的就不能够为它去设置宽度,如果设置的话可以对其绑定的控件进行设置.例如:绑定的控件对象为DataGridView那么可以这样 da ...

  8. 一些常用的方法(1)--去除DataTable中的重复数据

    private DataTable Display(DataTable dtSource)        {            DataTable dtTemp = dtSource.Copy() ...

  9. 使用SqlBulkCopy, 插入整个DataTable中的所有数据到指定数据库中

    string sql=""; dbhelper.ExecuteNonQuery(sql); DataTable dt = dbhelper.GetDataTable(sql); i ...

随机推荐

  1. ESLint可共享配置发布,团队自定义ESLint规则新鲜出炉

    ESLint于2013年6月份推出,至今4个年头,最新版本v4.8.0.它是目前主流的用于Javascript和JSX代码规范检查的利器,很多大公司比如Airbnb和Google均有一套自己的Java ...

  2. 项目常用Javascript分享,包含常用验证和Cookie操作

    function IsEmail(str) { var r = /^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; if (r.test(str)) ...

  3. 数据库表反向生成(一) MyBatis-generator与IDEA的集成

    在Dao层,通过数据库表反向生成,可以节省我们很多的精力,把更多的精力投入复杂的业务中. 数据库表反向生成,指的是通过数据库如mysql中的库表schema生成dao层读写表的基础代码,包括model ...

  4. jquery系列教程4-事件操作全解

    点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...

  5. Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP

    Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP 项目截图     这是我的目录结构 五步使用RxJava+Retrofit2+Okhttp+RxCache 第一步 ...

  6. SAP 参照sto订单创建外向交货BAPI

    DATA: SHIP_POINT TYPE TVST-VSTEL, "装运点/接收点 NUM_DELIVERIES TYPE VBNUM, STOCK_TRANS_ITEMS WITH HE ...

  7. 手机1520 win8.1升级win10

    昨天买了手机1520,卖家不错:https://item.taobao.com/item.htm?id=525484481986 于是我想把win8.1升级为win10 首先去http://www.i ...

  8. apache+php+mysql运行环境

    建议Apache2.4+php5.6+mysql5.5+phpmyadmin4.4.4 参考: http://jingyan.baidu.com/article/fcb5aff797ec41edaa4 ...

  9. 聊聊Java的字节码

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 巴山楚水凄凉地,二十三年弃置身.怀旧空吟闻笛赋,到乡翻似烂柯人.沉舟侧畔千帆过,病树前头万木春 ...

  10. EF框架搭建小总结--CodeFirst模型优先

    前言:之前在下总结编写了一篇 EF框架搭建小总结--ModelFirst模型优先 博文,看到一段时间内该博文的访问量蹭.蹭蹭.蹭蹭蹭...往上涨(实际也不是很多,嘿嘿),但是还是按捺不住内心的喜悦(蛮 ...