比较DataTable中新旧数据
内容不写了,代码上都做了写注释。
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中新旧数据的更多相关文章
- 去除DataTable中的重复数据
有时需要从DataTable中抽取Distinct数据,遍历比较费劲,C#.NET中其实有更易用的方法,如下: string[] columnArray = { "columnName1&q ...
- 【转载】C#如何往DataTable中新增一个数据列
在C#中的Datatable数据变量的操作过程中,有时候我们需要往现有的DataTable中新增一个自定义数据列,该列在原有的DataTable变量中并不存在,属于用户手工自定义新增的数据列,在往Da ...
- 如何删除datatable中的一行数据
在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(ind ...
- 从 vCenter Server 使用的数据库中清除旧数据 (2075138)(转)
Document Id 2075138 Symptoms 免责声明: 本文为 Purging old data from the database used by VMware vCenter Ser ...
- 关于C#读取MySql数据时,返回DataTable中某字段数据是System.Array[]形式
我在使用C#(VS2008)读取MySql数据库(5.1版本)时,返回的DataTable数据中arrivalDate字段数据显示为System.Array[]形式(程序中没有对返回的数据进行任何加工 ...
- Linux中“新旧”TCP/IP工具的对比
如今很多系统管理员依然通过组合使用诸如ifconfig.route.arp和netstat等命令行工具(统称为net-tools)来配置网络功能.解决网络故障,net-tools起源于BSD的TCP/ ...
- DataTable 怎样设置列宽? DataTable中已经有数据了怎样在现实的时候设置它的列宽?
首先要理解 DataTable是一个虚拟表,里面存有数据列,既然是虚拟的就不能够为它去设置宽度,如果设置的话可以对其绑定的控件进行设置.例如:绑定的控件对象为DataGridView那么可以这样 da ...
- 一些常用的方法(1)--去除DataTable中的重复数据
private DataTable Display(DataTable dtSource) { DataTable dtTemp = dtSource.Copy() ...
- 使用SqlBulkCopy, 插入整个DataTable中的所有数据到指定数据库中
string sql=""; dbhelper.ExecuteNonQuery(sql); DataTable dt = dbhelper.GetDataTable(sql); i ...
随机推荐
- PHP计算上个月的开始时间和结束时间戳
$m = date('Y-m-d', mktime(0,0,0,date('m')-1,1,date('Y'))); $t = date('t',strtotime($m)); //上个月共多少天 $ ...
- IIS 500错误或无法显示此网页解决方法
不知道是不是XP版本的原故,发现越来越多的XP系统装好IIS后连默认网站都打不开,(其他系统没有注意)出现几个大字,IIS 500错误.相信碰到这个问题的人都深有体会,确实很烦人.卸了IIS重装也是不 ...
- 【转】NAS 黑群晖 配置完成(不含硬盘),NAS能做什么?
在配黑群晖前,240元入手过一个艾美佳的NAS感受了下,功能倒还合适,就是配置太老,厂家固件也停止更新了,一直不太满意. 后来经常关注NAS1,发现现在X86的NAS也很好自己DIY了,就长草了,向女 ...
- word遇到错误 使其无法正常工作 因此需要关闭word 是否希望我们立刻修复
方法1: 网上找的方案: win10下按下快捷键win+R, 然后在里面输入 %appdata%\microsoft\templates ,确定,此时就会直接进入Word安装路径,在里面找到" ...
- 第二章 MySQL入门篇
第一章 MySQL入门篇 一.MySql简介 简言: 和SQL Server数据库相同,MySQl也是一个关系型数据库管理系统.由瑞典的MySQL AB公司开发,2008年被SUN公司收购,2009年 ...
- JS中的作用域以及全局变量的问题
一. JS中的作用域 1.全局变量:函数外声明的变量,称为全部变量 局部变量:函数内部使用var声明的变量,称为局部变量在JS中,只有函数作用域,没有块级作用域!!!也就是说,if/for等有{}的结 ...
- Delphi实现电脑端微信图片文件解密
电脑端微信收到图片后是存在了“C:\Users\系统用户名\Documents\WeChat Files\微信帐号\Data”目录下的,但文件不能直接使用图片浏览器打开的,因为做了一些加密,之前有个朋 ...
- C#设计模式之九装饰模式(Decorator)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第三个模式,该模式是[装饰模式].我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理解吧,大家一定要看清楚,是“装修”,不是“装饰”. ...
- formData 无需form异步上传多个图片
上周帮其它公司套一下一个web端微信投票系统的后台接口,遇到了一个图片以及视频上传报名的小问题,网上实现方式有很多但都不是ui上面的效果,于是自己动手改造了一个.先来看看效果图 流程很简单,就是点击每 ...
- require.js实现js模块化编程(二):RequireJS Optimizer
require.js实现js模块化编程(二):RequireJS Optimizer 这一节,我们主要学习一下require.js所提供的一个优化工具r.js的用法. 1.认识RequireJS Op ...