2016-05-31 80 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

相关问题