【发布时间】:2015-07-06 11:42:19
【问题描述】:
我有两个来自两个不同数据库的结果集,我需要比较它。我想要一个像
这样的操作A-B
对他们执行。
我无法执行逐行比较,因为 A 结果集中的第一行可以出现在 B 结果集中的任何位置。
以下是在 .NET 中执行此操作的代码,非常简单且完美。
var nonIntersecting = dtSource.AsEnumerable().Except
(
dtTarget.AsEnumerable(), DataRowComparer.Default
);
try
{
dtSrcToTgtResult = nonIntersecting.CopyToDataTable();
} catch (InvalidOperationException ex) {}
这里的 dtSource,dtTarget 是具有来自数据库的源数据和目标数据的数据表。 dtSrcToTgtResult 包含源中存在但目标中不存在的数据,这正是我想要的。
同样可以在带有结果集的 JavaScript 中完成。我也可以检查 CachedRowSet 或 webRowSet 是否有类似的内容。
编辑
对于投负票的人。这是我已经做过的,但它没有解决问题。
private Boolean compare(ResultSet rsSrc,ResultSet rsTgt,String ExecCondition)
{
Boolean status = true;
try
{
ResultSetMetaData metaSrc = rsSrc.getMetaData();
ResultSetMetaData metaTgt = rsTgt.getMetaData();
final int columnCountSrc = metaSrc.getColumnCount();
List<DBRow> dList = new ArrayList<DBRow>();
List<DBRow> DataInSourceNotInTarget = new ArrayList<DBRow>();
List<DBRow> DataInTargetNotInSource = new ArrayList<DBRow>();
DBRow d = new DBRow();
DBRow d1 = new DBRow();
for (int column = 1; column <= columnCountSrc; column++)
{
d.Row.add(metaSrc.getColumnName(column));
d1.Row.add(metaTgt.getColumnName(column));
}
DataInSourceNotInTarget.add(d);
DataInTargetNotInSource.add(d1);
if(ExecCondition.equals("Source To Target"))
{
while(rsSrc.next())
{
if(rsTgt.next())
{
for (int column = 1; column <= columnCountSrc; column++)
{
Object valueSrc = rsSrc.getObject(column);
Object valueTgt = rsTgt.getObject(column);
if(!valueSrc.toString().equals(valueTgt.toString()))
{
status=false;
System.out.println("ValueSRC: "+v alueSrc.toString());
System.out.println("ValueTgt: "+valueTgt.toString());
}
}
}
else
{
// if target rows ends
DBRow dr = new DBRow();
for (int column = 1; column <= columnCountSrc; column++)
{
Object valueSrc = rsSrc.getObject(column);
dr.Row.add(valueSrc);
}
DataInSourceNotInTarget.add(dr);
}
}
}//exec condition if
if(ExecCondition.equals("Target To Source"))
{
while(rsTgt.next())
{
if(rsSrc.next())
{
for (int column = 1; column <= columnCountSrc; column++)
{
Object valueSrc = rsSrc.getObject(column);
Object valueTgt = rsTgt.getObject(column);
if(!valueSrc.toString().equals(valueTgt.toString()))
{
status=false;
System.out.println("ValueSRC: "+valueSrc.toString());
System.out.println("ValueTgt: "+valueTgt.toString());
}
}
}
else
{
// if Source rows ends
DBRow dr = new DBRow();
for (int column = 1; column <= columnCountSrc; column++)
{
Object valueTgt = rsTgt.getObject(column);
dr.Row.add(valueTgt);
}
DataInTargetNotInSource.add(dr);
}
}
for(DBRow obj:DataInTargetNotInSource)
{
obj.print();
}
}//exec condition if
}
catch(Exception e)
{
e.printStackTrace();
}
return status;
}
【问题讨论】:
-
比较是如何进行的?源和目标是否具有相同的列?
-
@sharonbn 源和目标将具有相同的列,但数据中可能会出现不匹配,这就是验证。确定源中的内容而不是目标中的内容。
-
你想让别人做你的功课吗?
-
@Despicable 我已经编码,但这是逐行比较完成的。这并不能解决问题。我已经说过了。为什么要给减票。