两个DataTable,对比不相同的数据加入新的Table

时间:2022-08-29 08:02:44
两个DataTable,对比不相同的数据加入新的Table
测试数据:上面是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);
                    }
                }
            }

两个DataTable,对比不相同的数据加入新的Table
原图
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来实现  

#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)即可。

#6


两个FOR循环声明一个Y?

2楼的方法不错。。还简单。。

#7


把两个DataTable.

dt.AsEnumerable()

转换取差集。。。。

把差集存入。。

#8


又是做机票平台的- -!

#9


楼上都给答案了。

#10


引用 2 楼 q107770540 的回复:
http://blog.csdn.net/q107770540/archive/2011/03/16/6252339.aspx

真是学习了!

#11


现在是结构相同我做测试用的,实际情况不相同,我做的是个自动对账,主要结构跟上面一样但是数据库表需要多一个是否对账的状态,也就是如果那4列条件都相等就设状态为已对账,否则添加到新table显示出来,看了大家的,但还是很迷糊 ,我的方法基本算是废了,思路清楚就是无法用代码表示  两个DataTable,对比不相同的数据加入新的Table 

#12


select  * from tb union
select * from tb2

不能这样吗?

#13


引用 2 楼 q107770540 的回复:
http://blog.csdn.net/q107770540/archive/2011/03/16/6252339.aspx

   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


会加了  两个DataTable,对比不相同的数据加入新的Table

#15


楼上几位大大的方法不是我希望的,我要的想过是吧不相同的找出来,因为对linq不熟悉 ,改起来没思路也不会改,所以还是求循环的办法,期待明早·· 两个DataTable,对比不相同的数据加入新的Table

#16


引用 15 楼 bleach001 的回复:
楼上几位大大的方法不是我希望的,我要的想过是吧不相同的找出来,因为对linq不熟悉 ,改起来没思路也不会改,所以还是求循环的办法,期待明早··

转换list 取差集。。。
var expectedList = list1.Except(list2); 

#17


引用 16 楼 wxr0323 的回复:
引用 15 楼 bleach001 的回复:

楼上几位大大的方法不是我希望的,我要的想过是吧不相同的找出来,因为对linq不熟悉 ,改起来没思路也不会改,所以还是求循环的办法,期待明早··

转换list 取差集。。。
var expectedList = list1.Except(list2);

可以取,但就是取出来的结果跟事实不符合,完全相同的数据取交集的时候是null 取差集的不符合,是什么原因呢?不知道他的原理是什么,他的对比是一行对一行的吗,对于我这种多列的数据是不是不好使呢?谢谢!

#18


结贴来了!!! 两个DataTable,对比不相同的数据加入新的Table本人不才,楼上各位大大的方法都没有实现,是我没有实现 。测试了一下没有达到想要的效果,最后找出来其实是excel的问题,导出的时候第一列跟第二列合并了,导致测试结果有问题 ,所以深表遗憾,不过还是谢谢了。

最后的解决办法还是插入数据库然后cross join 两个DataTable,对比不相同的数据加入新的Table 虽然操作datatable可以,但是只成功一次,测试两种同样格式的excel文件,方法相同,其中一个可以找到相同的,但是另一个找不到,就是稍微改了一点,但是明明是有重复的就是结果不是想要的。老板发通牒了,今天必须完成,所以用最笨的办法了···
再次感谢!!!

#1


ADD前对DATAROW作一下非空判断 

从你的需求来看  可以用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)即可。

#6


两个FOR循环声明一个Y?

2楼的方法不错。。还简单。。

#7


把两个DataTable.

dt.AsEnumerable()

转换取差集。。。。

把差集存入。。

#8


又是做机票平台的- -!

#9


楼上都给答案了。

#10


引用 2 楼 q107770540 的回复:
http://blog.csdn.net/q107770540/archive/2011/03/16/6252339.aspx

真是学习了!

#11


现在是结构相同我做测试用的,实际情况不相同,我做的是个自动对账,主要结构跟上面一样但是数据库表需要多一个是否对账的状态,也就是如果那4列条件都相等就设状态为已对账,否则添加到新table显示出来,看了大家的,但还是很迷糊 ,我的方法基本算是废了,思路清楚就是无法用代码表示  两个DataTable,对比不相同的数据加入新的Table 

#12


select  * from tb union
select * from tb2

不能这样吗?

#13


引用 2 楼 q107770540 的回复:
http://blog.csdn.net/q107770540/archive/2011/03/16/6252339.aspx

   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


会加了  两个DataTable,对比不相同的数据加入新的Table

#15


楼上几位大大的方法不是我希望的,我要的想过是吧不相同的找出来,因为对linq不熟悉 ,改起来没思路也不会改,所以还是求循环的办法,期待明早·· 两个DataTable,对比不相同的数据加入新的Table

#16


引用 15 楼 bleach001 的回复:
楼上几位大大的方法不是我希望的,我要的想过是吧不相同的找出来,因为对linq不熟悉 ,改起来没思路也不会改,所以还是求循环的办法,期待明早··

转换list 取差集。。。
var expectedList = list1.Except(list2); 

#17


引用 16 楼 wxr0323 的回复:
引用 15 楼 bleach001 的回复:

楼上几位大大的方法不是我希望的,我要的想过是吧不相同的找出来,因为对linq不熟悉 ,改起来没思路也不会改,所以还是求循环的办法,期待明早··

转换list 取差集。。。
var expectedList = list1.Except(list2);

可以取,但就是取出来的结果跟事实不符合,完全相同的数据取交集的时候是null 取差集的不符合,是什么原因呢?不知道他的原理是什么,他的对比是一行对一行的吗,对于我这种多列的数据是不是不好使呢?谢谢!

#18


结贴来了!!! 两个DataTable,对比不相同的数据加入新的Table本人不才,楼上各位大大的方法都没有实现,是我没有实现 。测试了一下没有达到想要的效果,最后找出来其实是excel的问题,导出的时候第一列跟第二列合并了,导致测试结果有问题 ,所以深表遗憾,不过还是谢谢了。

最后的解决办法还是插入数据库然后cross join 两个DataTable,对比不相同的数据加入新的Table 虽然操作datatable可以,但是只成功一次,测试两种同样格式的excel文件,方法相同,其中一个可以找到相同的,但是另一个找不到,就是稍微改了一点,但是明明是有重复的就是结果不是想要的。老板发通牒了,今天必须完成,所以用最笨的办法了···
再次感谢!!!