两个相同结构的DataTable比较,得到增加和较少的DataTable
///
/// 比较两个DataTable数据(结构相同)mail:yx_007@163.com
///
/// 来自数据库的DataTable
/// 来自文件的DataTable
/// 新增数据(dt2中的数据)
/// 删除的数据(dt2中的数据)
/// 关键字段名
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;
}
}
}