关于两个dataset中数据的比较

lovedona 2009-04-24 01:54:40
提供两个dataset每个都有n百条数据7个列 DISP_SQ, TABPAGE_NO, GR, WIDTH1, WIDTH2, WIDTH3, LB_WIDTH
1。dsOINIFORM2
2。dsNINIFORM2
比较两个dataset里面的数据,如果条数不相等并且信息不相同显示旧dataset信息,向用户提示是否更新信息。
当用户选择更新显示新dataset信息。
...全文
1354 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingduwawa 2012-08-07
  • 打赏
  • 举报
回复
有种技术叫做LINQ 你可以试一下行不行
他可以想sql一样去处理内存中的两个集合

青春扯蛋 2011-08-31
  • 打赏
  • 举报
回复
貌似没人回答个所以然来。我现在也想用。但是。。。。。。 没答案。
gaincool 2011-01-05
  • 打赏
  • 举报
回复
建议用一个标记来记录.
SamuDra 2010-06-07
  • 打赏
  • 举报
回复
mark!
marvelstack 2009-06-12
  • 打赏
  • 举报
回复
可控性强一点,建议通过两次循环来进行比较
第一级为表,
第二级为表中的列比较。
losmars 2009-06-11
  • 打赏
  • 举报
回复
学习中
lovedona 2009-04-28
  • 打赏
  • 举报
回复
集合上面几位的代码我做的如下:
27877条数据超级慢
 //データをチェックする
if (dsOINIFORM2.Tables[0].Rows.Count == dsNINIFORM2.Tables[0].Rows.Count)
{
bool bolOK = false;

for (int index1 = 0; index1 < dsNINIFORM2.Tables[0].Rows.Count; index1++)
{
for (int index2 = 0; index2 < dsOINIFORM2.Tables[0].Rows.Count; index2++)
{

if (dsNINIFORM2.Tables[0].Rows[index1]["FORM_ID"].ToString() == dsOINIFORM2.Tables[0].Rows[index2]["FORM_ID"].ToString() &&
dsNINIFORM2.Tables[0].Rows[index1]["FIELD_ID"].ToString() == dsOINIFORM2.Tables[0].Rows[index2]["FIELD_ID"].ToString())
{
bolOK = true;

if (dsNINIFORM2.Tables[0].Rows[index1]["DISP_SQ"].ToString() == dsOINIFORM2.Tables[0].Rows[index2]["DISP_SQ"].ToString())
{
bolOK = false;
}
else if (dsNINIFORM2.Tables[0].Rows[index1]["TABPAGE_NO"].ToString() != dsOINIFORM2.Tables[0].Rows[index2]["TABPAGE_NO"].ToString())
{
bolOK = false;
}
else if (dsNINIFORM2.Tables[0].Rows[index1]["GR"].ToString() != dsOINIFORM2.Tables[0].Rows[index2]["GR"].ToString())
{
bolOK = false;
}
else if (dsNINIFORM2.Tables[0].Rows[index1]["WIDTH1"].ToString() != dsOINIFORM2.Tables[0].Rows[index2]["WIDTH1"].ToString())
{
bolOK = false;
}
else if (dsNINIFORM2.Tables[0].Rows[index1]["WIDTH2"].ToString() != dsOINIFORM2.Tables[0].Rows[index2]["WIDTH2"].ToString())
{
bolOK = false;
}
else if (dsNINIFORM2.Tables[0].Rows[index1]["WIDTH3"].ToString() != dsOINIFORM2.Tables[0].Rows[index2]["WIDTH3"].ToString())
{
bolOK = false;
}
else if (dsNINIFORM2.Tables[0].Rows[index1]["LB_WIDTH"].ToString() != dsOINIFORM2.Tables[0].Rows[index2]["LB_WIDTH"].ToString())
{
bolOK = false;
}

if (bolOK == false)
{
dsOINIFORM2.Tables[0].Rows[index2]["FLG"] = 1;
}

break;
}


}
}
wuyq11 2009-04-24
  • 打赏
  • 举报
回复
public static DataSet CompareDataSet(DataSet srcDataSet, DataSet destDataSet)
{
if (destDataSet == null || destDataSet.Tables.Count <= 0) return srcDataSet;
if (srcDataSet == null || srcDataSet.Tables.Count <= 0) return srcDataSet;
DataSet ds = new DataSet();
DataTable srcTable = srcDataSet.Tables[0].Copy();
srcTable.TableName = "table1";
DataTable destTable = destDataSet.Tables[0].Copy();
destTable.TableName = "table2";
ds.Tables.Add(srcTable);
ds.Tables.Add(destTable);
try
{
string relationName = "MidRelation";
int iColumnLen = srcTable.Columns.Count;
DataColumn[] parentDataColumn = new DataColumn[iColumnLen];
srcTable.Columns.CopyTo(parentDataColumn, 0);
DataColumn[] childDataColumn = new DataColumn[iColumnLen];
destTable.Columns.CopyTo(childDataColumn, 0);
DataRelation dataRelation = new DataRelation(relationName,
parentDataColumn, childDataColumn, false);
ds.Relations.Add(dataRelation);
DataRow[] drChild;
foreach (DataRow drParent in srcTable.Rows)
{
drChild = drParent.GetChildRows(dataRelation);
if (drChild == null || drChild.Length == 0) continue;
drParent.Delete();
}
srcTable.AcceptChanges();
DataSet rtnDs = new DataSet();
rtnDs.Tables.Add(srcTable.Copy());
return rtnDs;
}
catch (Exception ex)
{
throw ex;
}
finally
{
ds.Dispose();
}
}
zccmy22 2009-04-24
  • 打赏
  • 举报
回复

DataView dv=dataTable1.DefaultView;
StringBuilder sb=new StringBuilder();
int i=0;
foreach(DataRow row in dataTable2.Rows)
{

sb.Append(" columnName= '"+row.Columns["columnName"]+"'");
if(i <dataTable2.Rows.Count)
sb.Append(" and ");
i++;
}
dv.RowFilter=sb.ToString();
dataSource.DataSource=dv;
liyunfengleo 2009-04-24
  • 打赏
  • 举报
回复
可以在读取数据时比较
悔说话的哑巴 2009-04-24
  • 打赏
  • 举报
回复
还要把数据放在一个新的存储?
JackLeiMM 2009-04-24
  • 打赏
  • 举报
回复
DataSet.Container.Components把信息写入数组,然后进行比较,我想效果应该是差不多的
lovedona 2009-04-24
  • 打赏
  • 举报
回复
我现在的数据是28188条,这样比较好慢,不过不知道别的办法了,批量比较可能会有吧
wjf8882300 2009-04-24
  • 打赏
  • 举报
回复
应该做标记再修改,一条条比划不来
JackLeiMM 2009-04-24
  • 打赏
  • 举报
回复
郁闷,逻辑出了点问题,大概思路就是这个样子的,你改下吧
_see_you_again_ 2009-04-24
  • 打赏
  • 举报
回复

foreach (DataRow row in dsOINIFORM1.Tables[0])
{
foreach (DataRow row2 in dsOINIFORM2.Tables[0])
{
foreach (DataColumn col in dsOINIFORM1.Tables[0].Columns)
{
if (row[col] != row2[col.ColumnName])
{
//做一些数据不同时的操作
}
}
}
}
abcniu 2009-04-24
  • 打赏
  • 举报
回复
dsOINIFORM2.Table.Equals不成,是引用级了,
只能一条一条去比吧,
lovedona 2009-04-24
  • 打赏
  • 举报
回复
太谢谢楼上的gg了,想要得就是这个,呵呵
viki117 2009-04-24
  • 打赏
  • 举报
回复
两个DATASET比较很麻烦的。。
如果其中一个有点修改,就算之后修改回以前的值,用函数对比也会显示2个DATASET数据不一样。。
最好的办法是你有修改其中一个DATASET后,定义个变量,来表示这个DATASET已经被修改了数据。。
循环对比数据也不是不可以,太消耗了。。没必要吧
huadust 2009-04-24
  • 打赏
  • 举报
回复
我也只知道foreach来比较。。。
加载更多回复(13)

110,571

社区成员

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

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

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