2012-12-04 17 views
0

如何比较两个不同数据库中的值与数据迁移中列中的相同数据。我正在运行jUnit测试,并没有通过测试相同的值。我究竟做错了什么?我知道我有源数据库和目标数据库设置为相同的数据库,即他们是同样的事情。我这样做是因为我想确保整个过程中的连接是正确的,并将任何问题都缩小到语法错误。名称列的行中的值是;倡议管理,错误&增强功能,硬件&软件请求。如何使用Java代码比较VARCHAR数据类型以确保数据库中的数据相同

public class DemandTypeCopier { 

    public static String QUERY_CREATECOPY = "select name from tr_demandtype where name=?"; 

} 

public void testQUERY_CREATECOPY() throws Exception{ 

    UnitTestHelper helper = new UnitTestHelper(); 
    Connection con = helper.getConnection(helper.sourceDBUrl); 
    Connection conTarget = helper.getConnection(helper.targetDBUrl); 
    String x = "Initiative management"; 

    PreparedStatement stmt = con.prepareStatement(DemandTypeCopier.QUERY_CREATECOPY); 
    stmt.setString(1, x); 
    ResultSet sourceVal = stmt.executeQuery(); 

    stmt = conTarget.prepareStatement(DemandTypeCopier.QUERY_CREATECOPY); 
    stmt.setString(1, x); 
    ResultSet targetVal = stmt.executeQuery(); 

    assertTrue(helper.resultSetsEqual(sourceVal,targetVal)); 

} 

public boolean resultSetsEqual (ResultSet source, ResultSet target) throws SQLException{ 
    while(source.next()) 
    { 
      target.next(); 
      ResultSetMetaData metadata = source.getMetaData(); 
      int count = metadata.getColumnCount(); 
      for (int i =1; i<=count; i++) 
      { 
       if(source.getObject(i) != target.getObject(i)) 
       { 
       return false; 
       } 
      } 
    } 
    return true; 
} 

回答

1

问题是,比较数据时,您测试的是对象标识而不是相等。

source.getObject(i) != target.getObject(i) 

以上将测试如果对象来自两个结果集返回是相同该不会是在大多数(所有?)的情况属实。你真正想要做的是平等的测试:

source.getObject(i).equals(target.getObject(i)) 

注意上面会抛出一个NullPointerException如果source.getObject(我)返回null,所以除非空值不得对任何在列数据库,你需要添加代码来处理空值。

将ORDER BY子句添加到您的查询中,否则不保证返回结果的顺序。

检查target.next()的结果,以便在两个结果集的大小不相等时正确处理大小写。

+0

我更改了ResultSetEqual以反映该更改,但仍未通过测试。它在assertTrue失败(helper.resultSetsEqual(sourceVal,targetVal)); – Croeber

+0

编辑答案添加关于ORDER BY和检查target.next()的部分,这可能是你的问题 –

相关问题