分析多组差异项保存成datatable

本文介绍了一种数据库差异检测的方法,通过比较不同日期的数据变化,找出数据不一致的情况。使用了自定义的CompareItem类来判断数据行是否相同,并创建了一个数据表来存储差异结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       private DataTable GetDqRqDiffs()
        {
            /*
                     Excel.Application app = new Excel.Application();
            app.Visible = true;
            MyCommon.FillDtToWorksheet(app, GetDqRqDiffs());
             * 
             */

            DataTable dt = new DataTable();
            dt.Columns.Add("rq", typeof(string));
            dt.Columns.Add("dq", typeof(string));
            dt.Columns.Add("lx", typeof(string));
            dt.Columns.Add("sl", typeof(int));
            dt.PrimaryKey = new DataColumn[] { dt.Columns["rq"], dt.Columns["dq"], dt.Columns["lx"] };
            List<CompareItem> citems = new List<CompareItem>();

            citems.Add(new CompareItem("YYJD", "XYJD", "YJDX"));
            /*MUTIPLE*/


            //遍历日期 整个HC数据
            string sqlTables = "SELECT a.name tablename FROM hc.sys.tables a WHERE a.type='U' AND a.name LIKE 'HCYSJ%' ORDER BY a.name";
            DataTable dtTables = MyCommon.GetDt(sqlTables, sqc.ConnectString);
            for (int i = 0; i < dtTables.Rows.Count; i++)
            {
                string daySql = string.Format("SELECT b.DQDM,b.QMC,a.* FROM dbo.{0} a JOIN dbo.DQDM b ON a.YJDWDDM=b.WDDM", dtTables.Rows[i][0].ToString());
                DataTable dayDt = MyCommon.GetDt(daySql, sqc.ConnectString);
                for (int j = 0; j < dayDt.Rows.Count; j++)
                {
                    for (int m = 0; m < citems.Count; m++)
                    {
                        CompareItem citem = citems[m];
                        if (!citem.IsSame(dayDt.Rows[j]))
                        {
                            //MyCommon.WriteLog(dayDt.Rows[j]["YYJD"].ToString() + "  " + dayDt.Rows[j]["XYJD"].ToString());
                            string[] cols = { "rq", "dq", "lx" };
                            string[] values = { dayDt.Rows[j]["HCSJ"].ToString().Substring(0,10)
                                                  , dayDt.Rows[j]["QMC"].ToString()
                                              ,citem.Prompt};
                            DataRow dr = MyCommon.FindRowFromDt(dt, cols, values);
                            if (null == dr)
                            {
                                dr = dt.NewRow();
                                dr["rq"] = values[0];
                                dr["dq"] = values[1];
                                dr["lx"] = values[2];
                                dr["sl"] = 1;
                                dt.Rows.Add(dr);
                            }
                            else
                            {
                                dr["sl"] = int.Parse(dr["sl"].ToString()) + 1;
                            }

                        }
                    }
                }
                //break; //testing=================================
            }


            return dt;
        }
  public class CompareItem
    {
        public string ItemA { set; get; }
        public string ItemB { set; get; }

        public string Prompt { set; get; }
        public CompareItem(string itemA, string itemB, string prompt)
        {
            this.ItemA = itemA;
            this.ItemB = itemB;
            this.Prompt = prompt;
        }

        public bool IsSame(DataRow dr)
        {
            Regex reg = new Regex(@"^\s*$");
            object o1 = dr[ItemA]; object o2 = dr[ItemB];

            //两个 null
            if (null == o1 && null == o2)
                return true;

            //一个为null 另一个非null且不为空
            else if (
                    (null == o1 && (null != o2 && !reg.IsMatch(o2.ToString())))
                    ||
                    ((null != o1 && !reg.IsMatch(o1.ToString())) && null == o2)
                )
                return false;
            // 一个为null 另一个非null且为空??

            //两个都不为null
            else if (o1.ToString().Equals(o2.ToString()))
                return true;
            else
                return false;
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值