比较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 ...
随机推荐
- LeetCode-2 Keys Keyboard
package Classify.DP.Medium; import org.junit.jupiter.api.Test; /** Initially on a notepad only one c ...
- html加载时事件触发顺序
一般情况下页面的响应加载顺序时,域名解析-加载html-加载js和css-加载图片等其他信息. jq ready()的方法就是Dom Ready,他的作用或者意义就是:在DOM加载完成后就可以可以对D ...
- pseudocode of zigzag conversion
1.Title : The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of ...
- Pyquery API中文版
Pyquery的用法与jQuery相同,可以直接参考jQuery API学习.
- C# 复制列表
本文:如何复制一个列表 最简单的方法是 foreach foreach(var temp in a) { b.Add(temp); } 有没一个简单的方法? using System.Linq; va ...
- 根据选中不同的图元来显示不同的属性面板changePropertyPane.html
在现实生活中,我们有很多时候需要根据选中不同的东西来获取不同的属性,并且就算是同类型的东西我们有时也希望显示不同的属性,就像每个人都有不同的个性,可能会有相同点,但是不可能完全相同. 根据这个思想,我 ...
- 新型勒索软件Magniber正瞄准韩国、亚太地区开展攻击
近期,有国外研究人员发现了一种新型的勒索软件,并将其命名为Magniber,值得注意的是,这款勒索软只针对韩国及亚太地区的用户开展攻击.该勒索软件是基于Magnitude exploit kit(简称 ...
- asp中日志方法
代码文件log.asp中内容如下: <% Function getPath() getPath = request.servervariables("APPL_PHYSICAL_PAT ...
- JAVA基础知识总结:一
一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器(爱奇艺,乐视, ...
- python函数下篇装饰器和闭包,外加作用域
装饰器和闭包的基础概念 装饰器是一种设计模式能实现代码重用,经常用于查日志,性能测试,事务处理等,抽离函数大量不必的功能. 装饰器:1.装饰器本身是一个函数,用于装饰其它函数:2.功能:增强被装饰函数 ...