2012-12-04 62 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()的部分,這可能是你的問題 –

相關問題