测试数据:上面是excel数据,下面为数据库读出的
DataTable table1 = Session["PNRbookTable"] as DataTable; //数据库数据
DataTable table2 = Session["ImportTable"] as DataTable; //导入数据
DataTable NewTable = new DataTable();
DataColumn PNR = new DataColumn("PNR", typeof(string));
DataColumn PassengerName = new DataColumn("PassengerName", typeof(string));
DataColumn TicketNumber = new DataColumn("TicketNumber", typeof(string));
DataColumn Salesprice = new DataColumn("Salesprice", typeof(float));
NewTable.Columns.Add(PNR);
NewTable.Columns.Add(PassengerName);
NewTable.Columns.Add(TicketNumber);
NewTable.Columns.Add(Salesprice);
for (int i = 0; i < table1.Rows.Count; i++) //数据库数据每一行对导入数据进行比对
{
for (int y = 0; y < table1.Rows.Count; y++)
{
if (table1.Rows[i]["PNR"].ToString() != table2.Rows[y]["PNR"].ToString())
{
DataRow row = NewTable.NewRow();
row = table1.Rows[i];
NewTable.Rows.Add(row.ItemArray);
}
}
for (int y = 0; y < table2.Rows.Count; y++)
{
if (table1.Rows[i]["PNR"].ToString() != table2.Rows[y]["PNR"].ToString())
{
DataRow row = NewTable.NewRow();
row = table2.Rows[i];
NewTable.Rows.Add(row.ItemArray);
}
}
}
原图
http://www.itdaan.com/imgs/7/3/9/3/48/5cca5675a1af352e8f5408536cdf1159.jpe
两个table结构相同,但是数量可能不同进行排除,根据数据库表一行数据依次对导入数据的每一行遍历,并将不同的内容添加到新的table里面
但是每次到第二个for循环table2的Row会变成5 多了一个null值,按理说是4,,不清楚那一列null值是为何存在的,所以每次找到不同的时候,执行add添加的时候会报错(数组大于表中列)。有没有好的解决办法进行对比呢?
18 个解决方案
#1
ADD前对DATAROW作一下非空判断
从你的需求来看 可以用LINQ2DATATABLE来实现
从你的需求来看 可以用LINQ2DATATABLE来实现
#4
for (int i = 0; i < table1.Rows.Count; i++)
{
for (int y = 0; y < table1.Rows.Count; y++)//这个for循环是干嘛的?
{
if (table1.Rows[i]["PNR"].ToString() != table2.Rows[y]["PNR"].ToString())
{
DataRow row = NewTable.NewRow();
row = table1.Rows[i];
NewTable.Rows.Add(row.ItemArray);
}
}
for (int y = 0; y < table2.Rows.Count; y++)
{
if (table1.Rows[i]["PNR"].ToString() != table2.Rows[y]["PNR"].ToString())
{
DataRow row = NewTable.NewRow();
row = table2.Rows[i];
NewTable.Rows.Add(row[0],row[2],row[3],row[4]);
}
}
}
#5
其实不用这么麻烦,把table2合并到table1即可,条件是要设置table1和table12的主键为PRN列:
设置好后,调用table1.merger(table2)即可。
设置好后,调用table1.merger(table2)即可。
#6
两个FOR循环声明一个Y?
2楼的方法不错。。还简单。。
2楼的方法不错。。还简单。。
#7
把两个DataTable.
dt.AsEnumerable()
转换取差集。。。。
把差集存入。。
dt.AsEnumerable()
转换取差集。。。。
把差集存入。。
#8
又是做机票平台的- -!
#9
楼上都给答案了。
#10
真是学习了!
#11
现在是结构相同我做测试用的,实际情况不相同,我做的是个自动对账,主要结构跟上面一样但是数据库表需要多一个是否对账的状态,也就是如果那4列条件都相等就设状态为已对账,否则添加到新table显示出来,看了大家的,但还是很迷糊 ,我的方法基本算是废了,思路清楚就是无法用代码表示
#12
select * from tb union
select * from tb2
不能这样吗?
select * from tb2
不能这样吗?
#13
where dtB.AsEnumerable().Where(b => a.Field<int>("id") == b.Field<int>("id")
&& a.Field<string>("name") == b.Field<string>("name")).Count() == 0
select a).Concat(dtB.AsEnumerable()).OrderBy(o => o.Field<int>("id"));
linq判断如果加条件呢 比如我添加性别 年龄,都要相同请问怎么添加
#14
会加了
#15
楼上几位大大的方法不是我希望的,我要的想过是吧不相同的找出来,因为对linq不熟悉 ,改起来没思路也不会改,所以还是求循环的办法,期待明早··
#16
转换list 取差集。。。
var expectedList = list1.Except(list2);
#17
可以取,但就是取出来的结果跟事实不符合,完全相同的数据取交集的时候是null 取差集的不符合,是什么原因呢?不知道他的原理是什么,他的对比是一行对一行的吗,对于我这种多列的数据是不是不好使呢?谢谢!
#18
结贴来了!!!
本人不才,楼上各位大大的方法都没有实现,是我没有实现 。测试了一下没有达到想要的效果,最后找出来其实是excel的问题,导出的时候第一列跟第二列合并了,导致测试结果有问题 ,所以深表遗憾,不过还是谢谢了。
最后的解决办法还是插入数据库然后cross join 虽然操作datatable可以,但是只成功一次,测试两种同样格式的excel文件,方法相同,其中一个可以找到相同的,但是另一个找不到,就是稍微改了一点,但是明明是有重复的就是结果不是想要的。老板发通牒了,今天必须完成,所以用最笨的办法了···
再次感谢!!!
最后的解决办法还是插入数据库然后cross join 虽然操作datatable可以,但是只成功一次,测试两种同样格式的excel文件,方法相同,其中一个可以找到相同的,但是另一个找不到,就是稍微改了一点,但是明明是有重复的就是结果不是想要的。老板发通牒了,今天必须完成,所以用最笨的办法了···
再次感谢!!!
#1
ADD前对DATAROW作一下非空判断
从你的需求来看 可以用LINQ2DATATABLE来实现
从你的需求来看 可以用LINQ2DATATABLE来实现
#2
#3
#4
for (int i = 0; i < table1.Rows.Count; i++)
{
for (int y = 0; y < table1.Rows.Count; y++)//这个for循环是干嘛的?
{
if (table1.Rows[i]["PNR"].ToString() != table2.Rows[y]["PNR"].ToString())
{
DataRow row = NewTable.NewRow();
row = table1.Rows[i];
NewTable.Rows.Add(row.ItemArray);
}
}
for (int y = 0; y < table2.Rows.Count; y++)
{
if (table1.Rows[i]["PNR"].ToString() != table2.Rows[y]["PNR"].ToString())
{
DataRow row = NewTable.NewRow();
row = table2.Rows[i];
NewTable.Rows.Add(row[0],row[2],row[3],row[4]);
}
}
}
#5
其实不用这么麻烦,把table2合并到table1即可,条件是要设置table1和table12的主键为PRN列:
设置好后,调用table1.merger(table2)即可。
设置好后,调用table1.merger(table2)即可。
#6
两个FOR循环声明一个Y?
2楼的方法不错。。还简单。。
2楼的方法不错。。还简单。。
#7
把两个DataTable.
dt.AsEnumerable()
转换取差集。。。。
把差集存入。。
dt.AsEnumerable()
转换取差集。。。。
把差集存入。。
#8
又是做机票平台的- -!
#9
楼上都给答案了。
#10
真是学习了!
#11
现在是结构相同我做测试用的,实际情况不相同,我做的是个自动对账,主要结构跟上面一样但是数据库表需要多一个是否对账的状态,也就是如果那4列条件都相等就设状态为已对账,否则添加到新table显示出来,看了大家的,但还是很迷糊 ,我的方法基本算是废了,思路清楚就是无法用代码表示
#12
select * from tb union
select * from tb2
不能这样吗?
select * from tb2
不能这样吗?
#13
where dtB.AsEnumerable().Where(b => a.Field<int>("id") == b.Field<int>("id")
&& a.Field<string>("name") == b.Field<string>("name")).Count() == 0
select a).Concat(dtB.AsEnumerable()).OrderBy(o => o.Field<int>("id"));
linq判断如果加条件呢 比如我添加性别 年龄,都要相同请问怎么添加
#14
会加了
#15
楼上几位大大的方法不是我希望的,我要的想过是吧不相同的找出来,因为对linq不熟悉 ,改起来没思路也不会改,所以还是求循环的办法,期待明早··
#16
转换list 取差集。。。
var expectedList = list1.Except(list2);
#17
可以取,但就是取出来的结果跟事实不符合,完全相同的数据取交集的时候是null 取差集的不符合,是什么原因呢?不知道他的原理是什么,他的对比是一行对一行的吗,对于我这种多列的数据是不是不好使呢?谢谢!
#18
结贴来了!!!
本人不才,楼上各位大大的方法都没有实现,是我没有实现 。测试了一下没有达到想要的效果,最后找出来其实是excel的问题,导出的时候第一列跟第二列合并了,导致测试结果有问题 ,所以深表遗憾,不过还是谢谢了。
最后的解决办法还是插入数据库然后cross join 虽然操作datatable可以,但是只成功一次,测试两种同样格式的excel文件,方法相同,其中一个可以找到相同的,但是另一个找不到,就是稍微改了一点,但是明明是有重复的就是结果不是想要的。老板发通牒了,今天必须完成,所以用最笨的办法了···
再次感谢!!!
最后的解决办法还是插入数据库然后cross join 虽然操作datatable可以,但是只成功一次,测试两种同样格式的excel文件,方法相同,其中一个可以找到相同的,但是另一个找不到,就是稍微改了一点,但是明明是有重复的就是结果不是想要的。老板发通牒了,今天必须完成,所以用最笨的办法了···
再次感谢!!!