110,533
社区成员
发帖
与我相关
我的任务
分享
用Linq来处理一下。
var QueryTable =
from dr1 in tablek.AsEnumerable()
from dr2 in tabled.AsEnumerable()
where dr1.Field<string>("A") != dr2.Field<string>("A") && dr1.Field<int>("B") != dr2.Field<int>("B") && dr1.Field<string>("C") != dr2.Field<string>("C") && dr1.Field<string>("D") != dr2.Field<string>("D")
select dr2;
DataTable dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
//把A,B设置为联合主键
dt.PrimaryKey = new DataColumn[] { dt.Columns["A"], dt.Columns["B"] };
dt.LoadDataRow(new object[] { "a1", "b1" },false);
dt.LoadDataRow(new object[] { "a2", "b2" },false);
//另外建一个相同结构的表,
DataTable dt1 = new DataTable();
dt1.Columns.Add("A");
dt1.Columns.Add("B");
//a1,b1和原表冲突,但有联合主键判定,所以合并结果不更新
dt1.LoadDataRow(new object[] { "a1", "b1" }, false);
//a1,b2,虽然出现了a1,但因为是联合主键,a1,b2在原表里没有,则合并结果为新增
dt1.LoadDataRow(new object[] { "a1", "b2" }, false);
//a3,b3原表根本没有,所以合并结果为新增
dt1.LoadDataRow(new object[] { "a3", "b3" }, false);
dt.Merge(dt1);//合并两个dt,以dt为主表,dt1为附表,使用dt的主键设置,dt里没有的主键记录新增(insert);dt如果已经存在主键,其他非主键不同则更新(update)