两个数据库进行数据比对(DataTable对比)

来源:互联网 发布:剑三花爹数据 编辑:程序博客网 时间:2024/06/01 08:21

前一段时间做了一个数据比对的工作,大致的要求是这样:

  1. 首先从A库导出产品的数据模型到Excel中,导出完成时记录导出产品条目以及产品结构到B库的Model表和Partstr表中。
  2. 然后就是每隔一段固定时间系统自动进行数据比对(系统自动执行比对服务详见http://blog.csdn.net/u012147433/article/details/48730591
  3. 如果有A、B库中的数据有不同,则记录数据到B库的Model表和Partstr表中的标识字段上,便于后续的下载或者更新数据。
针对以上的要求,大致将编码工作氛围以下的思路:
  1. 首先读取B库中Model表的内容,读取出Model表中存在的产品(略过数据导出到Excel的过程)
  2. 循环Model中存在的产品,分别从A、B库中循环取出对应该产品的结构datatableA和datatableB,初始设定Bool Changed=fasle
  3. 在某一个产品的循环内,先以datatableA为标准一条条的对比datatableB中的数据,如果datatableA中存在而datatableB不存在,则将该条数据加入到Partstr表中并在标识字段上标明Add,Changed=true
  4. 在某一个产品的循环内,再以datatableB为标准一条条的对比datatableA中的数据,如果datatableB中存在而datatableA不存在,则将该条数据的标识字段标明delete,Changed=true
  5. 在某一个产品的循环内,只要有对比数据不同,均会在Model表中做上标识,表明该产品数据有变更
  6. 在一个产品循环之后,再循环下一个产品,直到把存在于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
原创粉丝点击