两个DataTable比较的方法

两个相同结构的DataTable比较,得到增加和较少的DataTable

/// <summary>
        /// 比较两个DataTable数据(结构相同)mail:yx_007@163.com
        /// </summary>
        /// <param name="dtDest">来自数据库的DataTable</param>
        /// <param name="dtSrc">来自文件的DataTable</param>
        /// <param name="dtRetAdd">新增数据(dt2中的数据)</param>
        /// <param name="dtRetDel">删除的数据(dt2中的数据)</param>
        /// <param name="keyFields">关键字段名</param>
        public static void CompareDt(DataTable dtSrc, DataTable dtDest, out DataTable dtRetAdd, out DataTable dtRetDel, string keyFields)
        {
            dtDest.Merge(


            dtRetDel = dtSrc.Clone();
            dtRetAdd = dtRetDel.Clone();
            StringBuilder sSrc = new StringBuilder();
            StringBuilder sDest = new StringBuilder();
            string[] sFields = keyFields.Split(',');//列名数组
            int iSrcCount = dtSrc.Rows.Count;
            int iDestCount = dtDest.Rows.Count;
            int iSrc = 0;
            int iDest = 0;
            int result = 0;
            bool isRun = true;
            dtSrc.Select("", keyFields);
            dtDest.Select("", keyFields);
            while (isRun)
            {
                if (iSrcCount == 0)//
                {
                    dtRetDel = dtDest;
                    isRun = false;
                    continue;
                }
                if (iDestCount == 0)
                {
                    dtRetAdd = dtDest;
                    isRun = false;
                    continue;
                }
                sSrc.Length = 0;
                sDest.Length = 0;
                for (result = 0; result < sFields.Length; result++)
                {
                    sSrc.Append(dtSrc.Rows[iSrc][sFields[result]]).Append(",");
                    sDest.Append(dtDest.Rows[iDest][sFields[result]]).Append(",");
                }
                result = string.Compare(sSrc.ToString(), sDest.ToString(), true);
                switch (result)
                {
                    src表小则新增src表
                    case -1:
                        dtRetAdd.Rows.Add(dtSrc.Rows[iSrc].ItemArray);
                        iSrc++;
                        break;
                    相同同时向下移动
                    case 0:
                        iSrc++;
                        iDest++;
                        break;
                    src表大则删除dest表
                    case 1:
                        dtRetDel.Rows.Add(dtDest.Rows[iDest].ItemArray);
                        iDest++;
                        break;
                }
                //检查是否已经移动到最后一条
                if ((iSrc == iSrcCount - 1) && (iDest < iDestCount - 1))
                {
                    for (result = iDest; result < iDestCount; result++)
                    {
                        dtRetDel.Rows.Add(dtDest.Rows[result].ItemArray);
                    }
                    isRun = false;
                    continue;
                }
                if ((iSrc < iSrcCount - 1) && (iDest == iDestCount - 1))
                {
                    for (result = iSrc; result < iSrcCount; result++)
                    {
                        dtRetAdd.Rows.Add(dtSrc.Rows[result].ItemArray);
                    }
                    isRun = false;
                    continue;
                }
                if ((iSrc == iSrcCount - 1) && (iDest == iDestCount - 1))
                {
                    isRun = false;
                    continue;
                }
            }
        }

转载于:https://my.oschina.net/lidayong/blog/4645

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值