前一段时间做了一个数据比对的工作,大致的要求是这样:
- 首先从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);
本文介绍了一种数据比对的工作流程,涉及从A库导出数据到Excel,然后与B库进行定时比对。通过读取B库Model表中的产品,循环对比A、B库中产品的数据结构(datatableA和datatableB),记录差异到Partstr表,并标记变更状态。比对过程中,先以datatableA为基准检查Add操作,再以datatableB检查Delete操作,确保所有不同都被标记。整个过程遍历Model表中的所有产品,实现了全面的数据一致性检查。
9710

被折叠的 条评论
为什么被折叠?



