热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> .Net编程>>正文内容

ASP.NET几秒内快速比较结构相同的两个DataTable数据

发布时间:2010年04月27日点击数: 佚名

最近项目上有一个功能,要求是实时采集和更新可售商品记录。可售商品信息来源于另外一套销售系统的接口。
通常可售商品记录在8万条左右,采集的数据不提供主键,按照一系列的字段内容识别是否相同,好多字段为null值。(所以无法进行主键比较)
采集和保存的业务规则是:
从采集的数据中对照数据库中,采集的数据中存在而库中不存在的商品,属于新增加的商品记录,需要增加到库中。
而库中存在但采集的数据中不存在的,则属于已经销售的商品,需要从库中删除。
为此查阅了很多xdjm的代码,给出了若干解决方法。
可惜在数据量很小的情况还行,当使用实际数据进行时,对照时间已经不能忍受。
代码如下:

  1. /// <summary> 
  2.         /// 比较两个DataTable数据(结构相同)mail:yx_007@163.com 
  3.         /// </summary> 
  4.         /// <param name="dtDest">来自数据库的DataTable</param> 
  5.         /// <param name="dtSrc">来自文件的DataTable</param> 
  6.         /// <param name="dtRetAdd">新增数据(dt2中的数据)</param> 
  7.         /// <param name="dtRetDel">删除的数据(dt2中的数据)</param> 
  8.         /// <param name="keyFields">关键字段名</param> 
  9.         public static void CompareDt(DataTable dtSrc, DataTable dtDest, out DataTable dtRetAdd, out DataTable dtRetDel, string keyFields) 
  10.         { 
  11.             dtRetDel = dtSrc.Clone(); 
  12.             dtRetAdd = dtRetDel.Clone(); 
  13.             StringBuilder sSrc = new StringBuilder(); 
  14.             StringBuilder sDest = new StringBuilder(); 
  15.             string[] sFields = keyFields.Split(',');//列名数组 
  16.             int iSrcCount = dtSrc.Rows.Count; 
  17.             int iDestCount = dtDest.Rows.Count; 
  18.             int iSrc = 0; 
  19.             int iDest = 0; 
  20.             int result = 0; 
  21.             bool isRun = true
  22.             dtSrc.Select("", keyFields); 
  23.             dtDest.Select("", keyFields); 
  24.             while (isRun) 
  25.             { 
  26.                 if (iSrcCount == 0)// 
  27.                 { 
  28.                     dtRetDel = dtDest; 
  29.                     isRun = false
  30.                     continue
  31.                 } 
  32.                 if (iDestCount == 0) 
  33.                 { 
  34.                     dtRetAdd = dtDest; 
  35.                     isRun = false
  36.                     continue
  37.                 } 
  38.                 sSrc.Length = 0; 
  39.                 sDest.Length = 0; 
  40.                 for (result = 0; result < sFields.Length; result  ) 
  41.                 { 
  42.                     sSrc.Append(dtSrc.Rows[iSrc][sFields[result]]).Append(","); 
  43.                     sDest.Append(dtDest.Rows[iDest][sFields[result]]).Append(","); 
  44.                 } 
  45.                 result = string.Compare(sSrc.ToString(), sDest.ToString(), true); 
  46.                 switch (result) 
  47.                 { 
  48.                    ////src表小则新增src表 
  49.                    case -1: 
  50.                        dtRetAdd.Rows.Add(dtSrc.Rows[iSrc].ItemArray); 
  51.                        iSrc  ; 
  52.                        break
  53.                    ////相同同时向下移动 
  54.                    case 0: 
  55.                        iSrc  ; 
  56.                        iDest  ; 
  57.                        break
  58.                    ////src表大则删除dest表 
  59.                    case 1: 
  60.                        dtRetDel.Rows.Add(dtDest.Rows[iDest].ItemArray); 
  61.                        iDest  ; 
  62.                        break
  63.                 } 
  64.                 //检查是否已经移动到最后一条 
  65.                 if ((iSrc == iSrcCount - 1) && (iDest < iDestCount - 1)) 
  66.                 { 
  67.                     for (result = iDest; result < iDestCount; result  ) 
  68.                     { 
  69.                         dtRetDel.Rows.Add(dtDest.Rows[result].ItemArray); 
  70.                     } 
  71.                     isRun = false
  72.                     continue
  73.                 } 
  74.                 if ((iSrc < iSrcCount - 1) && (iDest == iDestCount - 1)) 
  75.                 { 
  76.                     for (result = iSrc; result < iSrcCount; result  ) 
  77.                     { 
  78.                         dtRetAdd.Rows.Add(dtSrc.Rows[result].ItemArray); 
  79.                     } 
  80.                     isRun = false
  81.                     continue
  82.                 } 
  83.                 if ((iSrc == iSrcCount - 1) && (iDest == iDestCount - 1)) 
  84.                 { 
  85.                     isRun = false
  86.                     continue
  87.                 } 
  88.             } 
  89.         } 

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作