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

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. Linux下将Apache(httpd)新增为系统服务及开机自启动

    1. 查看一下/etc/init.d/下是否存在httpd这个服务 ls /etc/init.d/ | grep httpd 如果没有执行下一步 2.将自己安装目录下的apachect1复制到该目录下 ...

  2. JavaScript 版数据结构与算法(四)集合

    今天,我们要讲的是数据结构与算法中的集合. 集合简介 什么是集合?与栈.队列.链表这些顺序数据结构不同,集合是一种无序且唯一的数据结构.集合有什么用?在 Python 中,我经常使用集合来给数组去重: ...

  3. HDU1789 Doing Homework again

    基础单调队列: #include<cstdio> #include<cstdlib> #include<iostream> #include<algorith ...

  4. structs2的核心和工作原理

     在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的 ...

  5. IDL 数组相关函数

    1.信息获取 Size()函数能够获取数组的相关信息.不设置关键字是,函数返回变量的基本信息:第一个返回值是变量的维数N_dims,但当变量是敞亮或未定义是返回值为0:第二个 到第N_dims+1个返 ...

  6. c# 图片转二进制/字符串 二进制/字符串反转成图片

    protected void Button1_Click(object sender, EventArgs e) { //图片转二进制 byte[] imageByte = GetPictureDat ...

  7. zookeeper curator处理会话过期session expired

    本文介绍在使用curator框架的时候如何handle session expire. 1.什么是zookeeper的会话过期? 一般来说,我们使用zookeeper是集群形式,如下图,client和 ...

  8. JAVA继承:编译与运行的关系(编译看左边,运行看右边)

    "成员变量,静态方法看左边:非静态方法:编译看左边,运行看右边." 意思是:当父类变量引用子类对象时(Fu f = new Zi();),在这个引用变量f指向的对象中,他的成员变量 ...

  9. JS中replace()用法举例

    语法: string.replace(regexp,replacement) 参数: regexp:声明了要替换的模式的RegExp对象.如果该参数是一个字符串,则将它作为要检索的直接量文本模式,而不 ...

  10. shell编程/字库裁剪(2)——编程过程

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7704085.html 作者:窗户 Q ...