两个数据库进行数据比对(DataTable对比)
来源:互联网 发布:剑三花爹数据 编辑:程序博客网 时间:2024/06/01 08:21
前一段时间做了一个数据比对的工作,大致的要求是这样:
- 首先从A库导出产品的数据模型到Excel中,导出完成时记录导出产品条目以及产品结构到B库的Model表和Partstr表中。
- 然后就是每隔一段固定时间系统自动进行数据比对(系统自动执行比对服务详见http://blog.csdn.net/u012147433/article/details/48730591)
- 如果有A、B库中的数据有不同,则记录数据到B库的Model表和Partstr表中的标识字段上,便于后续的下载或者更新数据。
针对以上的要求,大致将编码工作氛围以下的思路:
- 首先读取B库中Model表的内容,读取出Model表中存在的产品(略过数据导出到Excel的过程)
- 循环Model中存在的产品,分别从A、B库中循环取出对应该产品的结构datatableA和datatableB,初始设定Bool Changed=fasle
- 在某一个产品的循环内,先以datatableA为标准一条条的对比datatableB中的数据,如果datatableA中存在而datatableB不存在,则将该条数据加入到Partstr表中并在标识字段上标明Add,Changed=true
- 在某一个产品的循环内,再以datatableB为标准一条条的对比datatableA中的数据,如果datatableB中存在而datatableA不存在,则将该条数据的标识字段标明delete,Changed=true
- 在某一个产品的循环内,只要有对比数据不同,均会在Model表中做上标识,表明该产品数据有变更
- 在一个产品循环之后,再循环下一个产品,直到把存在于Model表中的所有产品都循环对比完成
*Step1——循环Model中存在的产品,分别从A、B库中循环取出对应该产品的结构datatableA和datatableB*
1.读取datatableA和datatableB的过程略,在这里主要介绍一下两张数据库表Model和Partstr
上图为Model表,其中的Flag字段记录变更信息,变更=1;未变更=2上图为Partstr表,其中的EXT1字段记录变更信息,新增=add;删除=delete
2.读取出来的datatableA和datatableB均有MID、PID、CID、Quantity这四个字段。下面进行的对比就是对比这四个字段
3.循环Model中存在的产品代码如下:
Changed = false; string Querysql = "select jm_code,jm_mid from jmds_model"; DataSet Checkinfo = db.GetClientStaticReadSet(Querysql); for (int i = 0; i < Checkinfo.Tables[0].Rows.Count; i++) { //循环得到产品代号和产品ID的值,钱刚,2015-09-17 string jm_code = Checkinfo.Tables[0].Rows[i]["JM_CODE"].ToString(); decimal partId = Convert.ToDecimal(Checkinfo.Tables[0].Rows[i]["JM_MID"]); //根据产品代号和产品ID的值来读取A库和B库中对应产品的datatableA和datatableB //....过程省略.... //如果t为1,则用A做标准比较B;t为2,则用B做标准反比A for (int t = 1; t <= 2; t++) { if (t == 1) { dtc = datatableA; } else dtc = datatableB; PLMContrastJMDS(t, dtc, ref Changed, partId); } }
*Step2——循环执行datatableA和datatableB的对比*
1.如上面的代码,for循环已经进入到PLMContrastJMDS方法中,在此方法中我们进行具体的比对,代码如下
/// <summary> /// 比较datatableA和datatableB数据差异的具体实现函数 /// </summary> /// <param name="t"></param> /// <param name="dtc"></param> /// <param name="Changed"></param> /// <param name="partId"></param> public void PLMContrastJMDS(int t, DataTable dtc, ref bool Changed, decimal partId) { //封装成一个方法,输入dataset的代号,执行不同的对比并修改数据 string InfoData; for (int m = 0; m < dtc.Rows.Count; m++) { decimal MID = partId;//得到设计BOM数据的JP_MID(t为1,则为datatableA的数据;为2,则为datatableB数据) string PID = dtc.Rows[m][1].ToString();//得到设计BOM数据的JP_PID(t为1,则为datatableA的数据;为2,则为datatableB数据) string CID = dtc.Rows[m][2].ToString();//得到设计BOM数据的JP_CID(t为1,则为datatableA的数据;为2,则为datatableB数据) string Quantity = dtc.Rows[m][3].ToString();//得到设计BOM数据的JP_CID(t为1,则为datatableA的数据;为2,则为datatableB数据) string QueryExistOrNot = ""; if (t == 1) { //通过datatableA中的值查询datatableB中有无该条数据,生成SQL语句 QueryExistOrNot = "select count(*) from jmds_partstr where JP_PID='" + PID + "' and JP_CID='" + CID + "'and JP_NUM='" + Quantity + "'"; } else { //通过datatableB中的值查询datatableA中有无该条数据,生成SQL语句 QueryExistOrNot = "select count(*) from mi_partstr where ps_parentid='" + PID + "' and ps_childid='" + CID + "' and ps_quantity='" + Quantity + "'"; } //执行SQL语句,如果返回的dataset的count值为0,则代表该数据在datatableA或datatableB中不存在 DataSet ExistCount = db.GetClientStaticReadSet(QueryExistOrNot); //如果dataset的count值为0,则执行数据变更标记操作 if (Convert.ToDecimal(ExistCount.Tables[0].Rows[0].ItemArray[0]) == 0) { string Insertsql = ""; if (t == 1) { InfoData = "datatableA新增了数据"; //判断为datatableA新增了数据,则在datatableB中添加相应的行 Insertsql = "insert into jmds_partstr(JP_ID,JP_MID,JP_PID,JP_CID,JP_NUM,JP_EXT1,JP_EXT2,JP_EXT3) values('','" + MID + "' ,'" + PID + "','" + CID + "','" + Quantity + "','add','','')"; } else { InfoData = "datatableA删除了数据"; //判断为datatableA删除了数据,则在datatableB中删除相应的行 Insertsql = "update jmds_partstr set JP_EXT1='delete' WHERE JP_MID='" + MID + "' and JP_PID='" + PID + "' and JP_CID='" + CID + "'and JP_NUM='" + Quantity + "'"; } string Updatesql = "update jmds_model set jm_flag =1 ,jm_ext1= '" + InfoData + "' where jm_mid='" + MID + "'"; db.GetClientStaticReadSet(Updatesql); db.GetClientStaticReadSet(Insertsql); Changed = true; } } }
2.对比完成之后,如果数据有更改,则返回的Changed值为true,并且datatableB数据库中对应的数据库表Model和Partstr都会标识相应的变更状态;如果值为False,则表标识字段不变。
3.为了避免每次执行查询时上一次标识的表更状态影响本次的对比,在每一次执行PLMContrastJMDS方法之前都将上一次标识在Partstr表中的标记归零。
string UpdateTemp = "DELETE FROM jmds_partstr WHERE JP_EXT1='add'";//去掉标示在JP_EXT1上定义为“该条数据有待更新,更新数据来自datatableA”的字段 string DeleteTemp = "update jmds_partstr set JP_EXT1='' WHERE JP_EXT1='delete'";//去掉标示在JP_EXT1上定义为“该条数据有待删除,源datatableA中已经不存在该条数据”的字段 db.GetClientStaticReadSet(UpdateTemp); db.GetClientStaticReadSet(DeleteTemp);
0 0
- 两个数据库进行数据比对(DataTable对比)
- 两个数据库相同表数据比对Excel宏例子
- 对DataTable数据进行查询过滤
- 两个postgresSQL数据库对象比对
- 使用SQL语句进行数据比对
- solid数据使用bwa进行比对
- 利用VLOOKUP()函数进行数据比对
- c# 对两个Datatable的结构相同进行合并
- c# 对两个Datatable的结构相同进行合并
- PowerDesigner连接数据库,PowerDesigner将数据同步到数据库,PowerDesigner和数据库中的表进行比对
- Oracle数据库比对更新数据
- 对DataTable进行分页
- 对DataTable进行分页
- 对DataTable进行分页
- 对datatable进行排序
- 对DataTable进行Distinct
- 对DataTable进行分页
- 比对两个字段同时相等时判定为重复,移除list重复数据,excel导入与数据库比对
- (一二九)获取文件的MineType、利用SSZipArchive进行压缩解压
- OGNL表达式struts2标签“%,#,$”
- 【算法C++】十进制字符串转十六进制字符串
- C#实现多线程
- 解决IE8以上乱码
- 两个数据库进行数据比对(DataTable对比)
- Hihocoder 1236 Scores【分块+bitset】
- Matlab & Mathematica 解符号方程组
- mule有关软件下载地址
- UML类图的几种关系
- lua中的pairs和ipairs
- 面试题43:n个骰子的点数(《剑指offer》)
- android画折线图之一AChartengine
- URAL 1198 Jobbery (强连通分量 Gabow)