C#向DataTable添加不重复记录的高难度问题,谢谢各位

gijquery4 2013-03-14 12:03:48
两个结构相同的DataTable;
一个是汇总DataTable数据表,以下称【汇总数据表】;
另一个新增DataTable数据表,以下称【新增数据表】。

需要将【新增数据表】中的数据导入到【汇总数据表】中,必须保证每次导入的数据与原【汇总数据表】中数据不重复。(说白一点就是不管在【新增数据表】中向【汇总数据表】导入多少条数据,【汇总数据表】中永远不能有重复的数据)

尝试用foreach(...)遍历判断是否重复再添加,这样可以做到,但是只要两个表的数据多起来,速度就会很慢,很慢....

请教各位,为达到提速的目的,还有什么好办法可以做到么?谢谢各位。

注:这些数据都保存在DataTable中,不能存到数据库中进行处理。
...全文
655 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
DENQH 2013-03-14
  • 打赏
  • 举报
回复
用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;
gijquery4 2013-03-14
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
ps:不管你在哪里存储,内存也好,数据库也罢,哪怕就是txt里面。你首先要做的就是解决如何判定不重复。先解决这个在来谈有没有啥多快好省的代码
wanghui0380 2013-03-14
  • 打赏
  • 举报
回复
ps:不管你在哪里存储,内存也好,数据库也罢,哪怕就是txt里面。你首先要做的就是解决如何判定不重复。先解决这个在来谈有没有啥多快好省的代码
wanghui0380 2013-03-14
  • 打赏
  • 举报
回复
问题是什么叫做不重复,不重复的依据是啥,如果是key 你直接datatable.merge方法就是 如果是全列比较,最好是新入一个时间戳字段把此字段当key,然后使用datatable.marge方法, 当然你也可以把所有列的数据 按规则合并成一个字段,把这个字段当key
Susiria 2013-03-14
  • 打赏
  • 举报
回复
两个办法: 1.手动把汇总表的所有列添加成主键列(datatable.constraint.add...),这样在插入新数据时如有重复将引发异常。 2.先让数据都添加进去,然后对汇总表作distinct操作,方式是调用(datatable.defaultview.totable(true,...)方法
天使会疯狂 2013-03-14
  • 打赏
  • 举报
回复
DataRow[] rows; DataRow[] rows1; DataTable dt = new DataTable("creName"); DataColumn dc1 = new DataColumn("product", Type.GetType("System.String")); DataColumn dc2 = new DataColumn("ProductName", Type.GetType("System.String")); DataColumn dc3 = new DataColumn("Parvalue", Type.GetType("System.String")); DataColumn dc4 = new DataColumn("ProductType", Type.GetType("System.String")); DataColumn dc5 = new DataColumn("CategoryName", Type.GetType("System.String")); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); dt.Columns.Add(dc4); dt.Columns.Add(dc5); for (int i = 0; i < DS.Tables[0].Rows.Count; i++) { rows= DS.Tables[0].Select("ProductId=" + DS.Tables[0].Rows[i][0] + ""); rows1 = dt.Select("product=" + DS.Tables[0].Rows[i][0] + ""); //用于判断改ProductId是否已经写入dt中 if (rows.Length > 1) { string a = ""; string Name = ""; string Parvalue = ""; string ProductType = ""; string CategoryName = ""; if (rows1.Length != 1) { foreach (DataRow row in rows) // 将查询的结果添加到dt中; { a = row[1].ToString(); Name = row[0].ToString(); Parvalue = row[2].ToString(); ProductType = row[3].ToString(); CategoryName = CategoryName + row[4].ToString() + "<br/>"; } DataRow dr = dt.NewRow(); dr[0] = Name; dr[1] = a; dr[2] = Parvalue; dr[3] =ProductType; dr[4] = CategoryName; dt.Rows.Add(dr); } } 这个是我项目里的去掉重复字段,你改改吧
Trust-Me 2013-03-14
  • 打赏
  • 举报
回复
但是只要两个表的数据多起来,速度就会很慢,很慢.... 数据多了为什么不找个存储介质呢,,,要是只是存储在DataTable 中的话,除了循环暂时还没想到别的方法,帮LZ Up
gijquery4 2013-03-14
  • 打赏
  • 举报
回复
引用 2 楼 DENQH 的回复:
重复是有一定限制的,你要的是什么不重复,如空值就必须重复。
不会存在空值的问题; 例如: 列1 列2 列3 列4 a 1 c d a 1 c d b 2 d f 以上第一行和第二行,便算是重复的了;
DENQH 2013-03-14
  • 打赏
  • 举报
回复
重复是有一定限制的,你要的是什么不重复,如空值就必须重复。
gijquery4 2013-03-14
  • 打赏
  • 举报
回复
不能向【汇总数据表】导入该表已经存在的数据。
  • 打赏
  • 举报
回复
现丑一下,也可以这么写: if(dt.Tables[0].Rows.IndexOf(DS.Tables[0].Rows[i]) > 0)
xixihaha_2011_098 2013-03-14
  • 打赏
  • 举报
回复
循环新增表和汇总表比较.不同的记录,list.ad(insert 不同记录); 循环完毕.用事物执行list就可以实现吧
游戏人间 2013-03-14
  • 打赏
  • 举报
回复
为DataTable 建立一个主键或唯一索引。 插入的时候就不会重复了。 或者 合并后去重复,datatable.defaultview.totable(true,字段1,字段2,.......)
dangmao 2013-03-14
  • 打赏
  • 举报
回复
引用 12 楼 xiaoning8201 的回复:
提个建议,要不直接加到数据库中,通过sql语句删除表中的重复项。
Linq就是充当此用
xiaoning8201 2013-03-14
  • 打赏
  • 举报
回复
提个建议,要不直接加到数据库中,通过sql语句删除表中的重复项。
wanghui0380 2013-03-14
  • 打赏
  • 举报
回复
这个玩意其实只需要把datatable设置一个联合主键,就能快速解决不重复的问题 我写了一个例子
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)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧