110,571
社区成员
发帖
与我相关
我的任务
分享
private void CompareDataTable(DataTable dtOld, DataTable dtNew)
{
DataRow[] drS; //存放指向旧表相应行的指针
bool bAllTheSame; //存放某行数据是否有所变更的标志
foreach(DataRow dr in dtNew.Rows)
{
drS = dtOld.Select("ID =" + dr["ID"].ToString()); //检索旧表,看是否有对应行
if (drS.Length > 0) //旧表有对应行
{
bAllTheSame = true;
for (int i = 0; i < dtOld.Columns.Count; i++) //看是否某列的值被变更
{
if (dr[i].ToString().CompareTo(drS[0][i].ToString()) != 0) //有变更
{
bAllTheSame = false;
break;
}
}
if (bAllTheSame) //所有列未被变更
{
dr["Status"] = "UnChanged";
drS[0]["Status"] = "UnChanged";
}
else //有些列被变更
{
dr["Status"] = "Modified";
drS[0]["Status"] = "Modified";
}
}
else //旧表中无对应行
{
dr["Status"] = "Added";
}
}//至此,新表标志完毕,旧表只剩删除行未被标志
foreach (DataRow dr in dtOld.Rows)
{
if (dr["Status"].ToString().Length == 0) //旧表中此行数据未被标志
{
dr["Status"] = "Delete";
}
}//至此,旧表删除行标志完毕
}
/// <summary>
/// 比较两表
/// </summary>
/// <param name="oldTable">老的版本</param>
/// <param name="newTable">新的版本</param>
/// <param name="primaryKeys">主键</param>
/// <returns>返回的结果中新增changed列标记结果</returns>
private static DataTable CompareDataTable(DataTable oldTable, DataTable newTable, params DataColumn[] primaryKeys)
{
DataTable result = newTable.Copy();
DataColumn[] tdc = new DataColumn[oldTable.Columns.Count];
for (int x = 0; x < oldTable.Columns.Count; x++)
{
tdc[x] = oldTable.Columns[x];
}
result.Columns.Add("changed");
oldTable.PrimaryKey = tdc;
oldTable.Columns.Add("changed");
DataRow dr = oldTable.NewRow();
for (int i = 0; i < newTable.Rows.Count; i++)
{
dr.ItemArray = newTable.Rows[i].ItemArray;
try
{
oldTable.Rows.Add(dr);
//注意:这里Remove以后dr的指针会跑没
oldTable.Rows.Remove(dr);
//因为前面的Remove使dr的指针跑掉了,所以要重新赋一次值
dr.ItemArray = newTable.Rows[i].ItemArray;
oldTable.PrimaryKey = primaryKeys;
try
{
oldTable.Rows.Add(dr);
result.Rows[i]["changed"] = "新增";
}
catch (ConstraintException)
{
result.Rows[i]["changed"] = "修改";
oldTable.Rows[i]["changed"] = "修改";
}
finally
{
oldTable.PrimaryKey = tdc;
}
}
catch (ConstraintException)
{
result.Rows[i]["changed"] = "没有改变";
oldTable.Rows[i]["changed"] = "没有改变";
}
}
foreach (DataRow rd in oldTable.Rows)
{
if (rd["changed"] == DBNull.Value)
{
rd["changed"] = "被删除的";
DataRow nr = result.NewRow();
nr.ItemArray = rd.ItemArray;
result.Rows.Add(nr);
}
}
return result;
}
DataTable oldTable = new DataTable();
DataTable newTable = new DataTable();
private void Form1_Load(object sender, EventArgs e)
{
oldTable.Columns.Add("Id", typeof(int));
oldTable.Columns.Add("Name");
oldTable.Rows.Add("1", "一");
oldTable.Rows.Add("2", "二");
newTable.Columns.Add("Id", typeof(int));
newTable.Columns.Add("Name");
newTable.Rows.Add("1", "一");
newTable.Rows.Add("2", "三");
newTable.Rows.Add("3", "二");
MessageBox.Show(dataTableCompare(oldTable, newTable));
}
private string dataTableCompare(DataTable oldTable, DataTable newTable)
{
oldTable.PrimaryKey = new DataColumn[] { oldTable.Columns["Id"], oldTable.Columns["Name"] };
string ret = string.Empty;
DataRow dr = oldTable.NewRow();
for (int i = 0; i < newTable.Rows.Count; i++)
{
dr.ItemArray = newTable.Rows[i].ItemArray;
try
{
oldTable.Rows.Add(dr);
//注意:这里Remove以后dr的指针会跑没
oldTable.Rows.Remove(dr);
//因为前面的Remove使dr的指针跑掉了,所以要重新赋一次值
dr.ItemArray = newTable.Rows[i].ItemArray;
oldTable.PrimaryKey = new DataColumn[] { oldTable.Columns["Id"] };
try
{
oldTable.Rows.Add(dr);
ret += string.Format("新表中的第{0}行是新增的\n", i.ToString());
}
catch
{
ret += string.Format("新表中的第{0}行是修改过的\n", i.ToString());
}
finally
{
oldTable.PrimaryKey = new DataColumn[] { oldTable.Columns["Id"], oldTable.Columns["Name"] };
}
}
catch
{
ret += string.Format("新表中的第{0}行是没有修改过的\n", i.ToString());
}
}
return ret;
}