/// <summary> /// 比较数据,得到新增的行,修改的行,删除的行,未变化的行 /// 此算法必须先排序 /// </summary> /// <param name="dtSource"></param> /// <param name="dtTarget"></param> /// <param name="insertRows"></param> /// <param name="updateRows"></param> /// <param name="deleteRows"></param> /// <param name="noChangeRows"></param> public static void CompareData(List <DataRow> dtSource, DataTable dtTarget, TableMap tabMap, out List <DataRow> insertRows, out List <DataRow> updateRows, out List <DataRow> deleteRows, out List <DataRow> noChangeRows) { insertRows = new List <DataRow>(); updateRows = new List <DataRow>(); deleteRows = new List <DataRow>(); noChangeRows = new List <DataRow>(); // 源表没有记录,则认为全部是删除的 if (dtSource.Count == 0) { for (int x = 0; x < dtTarget.Rows.Count; x++) { DataRow row = dtTarget.Rows[x]; deleteRows.Add(row); } return; } // 如果目标没有记录,则认为全部是新增的 if (dtTarget.Rows.Count == 0) { for (int x = 0; x < dtSource.Count; x++) { DataRow row = dtSource[x]; insertRows.Add(row); } return; } int i = 0; //i,j等于-1时表示对应的集合结束 int j = 0; int ret; //无条件循环,当有一个集合结束(下标变为-1)跳出循环 while (true) { if (i >= dtSource.Count) { i = -1; // 源结束 } if (j >= dtTarget.Rows.Count) { j = -1;// 目标结束 } //两个集合都没有结束时,执行比较,否则跳出循环(至少一个集合结束) if (i != -1 && j != -1) { DataRow rowSource = dtSource[i]; DataRow rowTarget = dtTarget.Rows[j]; // 注意这里,1)定义主键;2)排序条件是按主键排序;3)数据表只有一个主键 string strKeySourceValue = rowSource[tabMap.SourceTable.PrimaryKeyList[0]].ToString().ToLower(); //08/03/27改 string strKeyTargetValue = rowTarget[tabMap.TargetTable.PrimaryKeyList[0]].ToString().ToLower(); //08/03/27改 // 比较主键,以便确定是新增,还是修改/不变,还是删除 ret = string.Compare(strKeySourceValue, strKeyTargetValue, StringComparison.Ordinal);//, true);// 不能忽略大小写 2008/3/18 if (strKeySourceValue == "b01d046c91504a4fa3ab9d34ae005483") { int ntemp = 0; ntemp++; } // 当等于0时,主键相同,表示修改/不变的情况 if (ret == 0) { // 比较是否完全一致,从而确定是修改还是不变 if (tabMap.CompareRow(rowSource, rowTarget) == true) { noChangeRows.Add(rowSource); } else { updateRows.Add(rowSource); } i++; j++; } // 小于0,表示源在目标中不存在,新增 if (ret < 0) { insertRows.Add(rowSource); i++; } // 大于0,表示目标中多余的项,删除 if (ret > 0) { deleteRows.Add(rowTarget); j++; } } else { break; } } // 处理剩余的末尾记录 if (i != -1 && i < dtSource.Count) { for (; i < dtSource.Count; i++) { insertRows.Add(dtSource[i]); } } if (j != -1 && j < dtTarget.Rows.Count) { for (; j < dtTarget.Rows.Count; j++) { deleteRows.Add(dtTarget.Rows[j]); } } return; }