2016-05-31 104 views
1

我有一個用Java(netbeans/uncanaccess)編寫的SQL語句,它是一個相當簡單的選擇語句,包含一些來自我數據庫中一個表的IIF和SUM。當運行相同的查詢時,Java返回SQL的不同結果

當我在Access中運行SQL語句時,它返回正確的結果,但是當我嘗試在Java中運行它時,它返回的結果類似但不完全相同。

的Java代碼

public int getActualMHDetails(String strNumber, String strYear, String strPeriod){ 
    String strSQLString = null; 
    System.out.println("Getting cost details for: " + strNumber); 
    try{ 

strSQLString = "SELECT tblExportCost.ProjDef, tblExportCost.Year,\n" 
         + "Sum(IIf([Per]=1,[Val/ObjCur],0)) AS Jan, Sum(IIf([Per]=2,[Val/ObjCur],0)) AS Feb, Sum(IIf([Per]=3,[Val/ObjCur],0)) AS Mar,\n" 
         + "Sum(IIf([Per]=4,[Val/ObjCur],0)) AS Apr, Sum(IIf([Per]=5,[Val/ObjCur],0)) AS May, Sum(IIf([Per]=6,[Val/ObjCur],0)) AS Jun,\n" 
         + "Sum(IIf([Per]=7,[Val/ObjCur],0)) AS Jul, Sum(IIf([Per]=8,[Val/ObjCur],0)) AS Aug, Sum(IIf([Per]=9,[Val/ObjCur],0)) AS Sep,\n" 
         + "Sum(IIf([Per]=10,[Val/ObjCur],0)) AS Oct, Sum(IIf([Per]=11,[Val/ObjCur],0)) AS Nov, Sum(IIf([Per]=12,[Val/ObjCur],0)) AS Dec\n" 
         + "FROM tblExportCost\n" 
         + "GROUP BY tblExportCost.ProjDef, tblExportCost.Year, tblExportCost.Year\n" 
         + "HAVING (((tblExportCost.Year)= '" + strYear + "') AND ((tblExportCost.ProjDef)= 'T3415" + strNumber + "'))"; 

//SETTING PREPARED STATEMENT 
     PreparedStatement preStatement = con.prepareStatement(strSQLString, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 

     ResultSet rs = preStatement.executeQuery(); 

     rs.next(); 

     //IF CHECKS TO MAKE SURE RECORDS 
     if(rs.getRow()==0){ 
      rs.close();  
      preStatement.close(); 
      return 3; 
     }   

     strTest = rs.getString("Jan"); 

     System.out.println("Test Value: " + strTest); 

     intAMHCJan = rs.getInt("Jan"); 
     intAMHCFeb = rs.getInt("Feb"); 
     intAMHCMar = rs.getInt("Mar"); 
     intAMHCApr = rs.getInt("Apr"); 
     intAMHCMay = rs.getInt("May"); 
     intAMHCJun = rs.getInt("Jun"); 
     intAMHCJul = rs.getInt("Jul"); 
     intAMHCAug = rs.getInt("Aug"); 
     intAMHCSep = rs.getInt("Sep"); 
     intAMHCOct = rs.getInt("Oct"); 
     intAMHCNov = rs.getInt("Nov"); 
     intAMHCDec = rs.getInt("Dec"); 

     //CLOSES CONNECTIONS 
     System.out.println("Database query successful; closing connections"); 
     rs.close(); 
     preStatement.close();    

     return 1; 

    }catch(Exception ex){ 
     ex.printStackTrace(); 
     strEXMessage=ex.getMessage(); 
     return 2; 
    } 
} 

接入代碼

SELECT tblExportCost.ProjDef, tblExportCost.Year, 
Sum(IIf([Per]=1,[Val/ObjCur],0)) AS Jan, Sum(IIf([Per]=2,[Val/ObjCur],0)) AS Feb, Sum(IIf([Per]=3,[Val/ObjCur],0)) AS Mar, 
Sum(IIf([Per]=4,[Val/ObjCur],0)) AS Apr, Sum(IIf([Per]=5,[Val/ObjCur],0)) AS May, Sum(IIf([Per]=6,[Val/ObjCur],0)) AS Jun, 
Sum(IIf([Per]=7,[Val/ObjCur],0)) AS Jul, Sum(IIf([Per]=8,[Val/ObjCur],0)) AS Aug, Sum(IIf([Per]=9,[Val/ObjCur],0)) AS Sep, 
Sum(IIf([Per]=10,[Val/ObjCur],0)) AS Oct, Sum(IIf([Per]=11,[Val/ObjCur],0)) AS Nov, Sum(IIf([Per]=12,[Val/ObjCur],0)) AS Dec 
FROM tblExportCost 
GROUP BY tblExportCost.ProjDef, tblExportCost.Year, tblExportCost.Year 
HAVING (((tblExportCost.Year)= 2016) AND ((tblExportCost.ProjDef)= 'T34151234')) 

我甚至試圖挽救Access查詢和簡單的使用

strSQLString = "SELECT * FROM qryTestJava"; 

但這也返回同樣的結合直接結果。

結果

SQL

ProjDef  Year Jan  Feb    Mar   Apr  May 
T34151234 2016 22358.1 18742.9 3443.33000000001 10251.03 12706.78  

的Java

ProjDef  Year Jan  Feb   Mar  Apr  May 
T34151234 2016 22,329 18,714  3,420  10,226 12,684 

我做了一點挖掘,發現與精磨和ucanaccess Here類似的問題,但據報道,這在早期版本中修復。

我ucanaccess的當前版本是2.0.9.3

+0

你能嘗試使用最新的版本UCanAccess的n(現在是3.0.5)呢? –

+0

另外,'3443.33000000001'看起來像一個浮點值。您可以使用Access在設計視圖中打開[tblExportCost]並確認[Val]和[ObjCur]的列類型? (Single?Double?Currency?...?) –

+0

可能需要用WHERE子句替換HAVING? HAVING主要是當你用它來限制函數的時候,但是SQL試圖限制一些字段。此外,不需要在同一個字段上進行兩次組合。 – LukStorms

回答

3

我能夠重現UCanAccess 3.0.5下您的問題。所述IIf()函數出現時爲

SELECT IIf([Per]=1,[Val/ObjCur],0) AS ... 

調用以截斷雙精度值到它們的整數值,而當IIf()被調用0.0爲數字文字值的整個雙值被正確地返回,即

SELECT IIf([Per]=1,[Val/ObjCur],0.0) AS ... 

所以,你應該能夠通過使用

strSQLString = "SELECT tblExportCost.ProjDef, tblExportCost.Year,\n" 
         + "Sum(IIf([Per]=1,[Val/ObjCur],0.0)) AS Jan, Sum(IIf([Per]=2,[Val/ObjCur],0.0)) AS Feb, Sum(IIf([Per]=3,[Val/ObjCur],0.0)) AS Mar,\n" 
         + "Sum(IIf([Per]=4,[Val/ObjCur],0.0)) AS Apr, Sum(IIf([Per]=5,[Val/ObjCur],0.0)) AS May, Sum(IIf([Per]=6,[Val/ObjCur],0.0)) AS Jun,\n" 
         + "Sum(IIf([Per]=7,[Val/ObjCur],0.0)) AS Jul, Sum(IIf([Per]=8,[Val/ObjCur],0.0)) AS Aug, Sum(IIf([Per]=9,[Val/ObjCur],0.0)) AS Sep,\n" 
         + "Sum(IIf([Per]=10,[Val/ObjCur],0.0)) AS Oct, Sum(IIf([Per]=11,[Val/ObjCur],0.0)) AS Nov, Sum(IIf([Per]=12,[Val/ObjCur],0.0)) AS Dec\n" 
         + "FROM tblExportCost\n" 
         + "GROUP BY tblExportCost.ProjDef, tblExportCost.Year\n" 
         + "HAVING (((tblExportCost.Year)= '" + strYear + "') AND ((tblExportCost.ProjDef)= 'T3415" + strNumber + "'))"; 
+1

完美地工作,非常感謝一如既往Gord爲您的答案和明確的解釋! – ppw

相關問題