比较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 ...
随机推荐
- ESLint可共享配置发布,团队自定义ESLint规则新鲜出炉
ESLint于2013年6月份推出,至今4个年头,最新版本v4.8.0.它是目前主流的用于Javascript和JSX代码规范检查的利器,很多大公司比如Airbnb和Google均有一套自己的Java ...
- 项目常用Javascript分享,包含常用验证和Cookie操作
function IsEmail(str) { var r = /^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; if (r.test(str)) ...
- 数据库表反向生成(一) MyBatis-generator与IDEA的集成
在Dao层,通过数据库表反向生成,可以节省我们很多的精力,把更多的精力投入复杂的业务中. 数据库表反向生成,指的是通过数据库如mysql中的库表schema生成dao层读写表的基础代码,包括model ...
- jquery系列教程4-事件操作全解
点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...
- Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP
Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP 项目截图 这是我的目录结构 五步使用RxJava+Retrofit2+Okhttp+RxCache 第一步 ...
- SAP 参照sto订单创建外向交货BAPI
DATA: SHIP_POINT TYPE TVST-VSTEL, "装运点/接收点 NUM_DELIVERIES TYPE VBNUM, STOCK_TRANS_ITEMS WITH HE ...
- 手机1520 win8.1升级win10
昨天买了手机1520,卖家不错:https://item.taobao.com/item.htm?id=525484481986 于是我想把win8.1升级为win10 首先去http://www.i ...
- apache+php+mysql运行环境
建议Apache2.4+php5.6+mysql5.5+phpmyadmin4.4.4 参考: http://jingyan.baidu.com/article/fcb5aff797ec41edaa4 ...
- 聊聊Java的字节码
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 巴山楚水凄凉地,二十三年弃置身.怀旧空吟闻笛赋,到乡翻似烂柯人.沉舟侧畔千帆过,病树前头万木春 ...
- EF框架搭建小总结--CodeFirst模型优先
前言:之前在下总结编写了一篇 EF框架搭建小总结--ModelFirst模型优先 博文,看到一段时间内该博文的访问量蹭.蹭蹭.蹭蹭蹭...往上涨(实际也不是很多,嘿嘿),但是还是按捺不住内心的喜悦(蛮 ...