Java在运行相同查询时从SQL返回不同的结果
我有一个用Java编写的SQL语句(netbeans/uncanaccess),这是一个相当简单的select语句,其中包含几个IIF和来自数据库中一个表的SUM 当我在Access中运行SQL语句时,它会返回正确的结果,但是当我尝试在Java中运行它时,它会返回相似但不完全相同的结果 Java代码Java在运行相同查询时从SQL返回不同的结果,java,sql,ms-access,netbeans,ucanaccess,Java,Sql,Ms Access,Netbeans,Ucanaccess,我有一个用Java编写的SQL语句(netbeans/uncanaccess),这是一个相当简单的select语句,其中包含几个IIF和来自数据库中一个表的SUM 当我在Access中运行SQL语句时,它会返回正确的结果,但是当我尝试在Java中运行它时,它会返回相似但不完全相同的结果 Java代码 public int getActualMHDetails(String strNumber, String strYear, String strPeriod){ String strSQ
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'))
访问代码
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
爪哇
我做了一点挖掘,发现了类似的取整和ucanaccess问题,但据报道在早期版本中已经修复
我目前的ucanaccess版本是2.0.9.3我可以在ucanaccess 3.0.5下复制您的问题。
IIf()
选择IIf([Per]=1[Val/ObjCur],0)作为。。。
当使用0.0
作为数值文本值调用IIf()
时,正确返回整个双精度值,即
选择IIf([Per]=1[Val/ObjCur],0.0)作为。。。
因此,您应该能够通过使用
strSQLString=“选择tblExportCost.ProjDef,tblExportCost.Year\n”
+“金额(IIf([Per]=1,[Val/ObjCur],0.0])为一月,金额(IIf([Per]=2,[Val/ObjCur],0.0])为二月,金额(IIf([Per]=3,[Val/ObjCur],0.0])为三月,\n”
+“总和(IIf([Per]=4,[Val/ObjCur],0.0])为四月,总和(IIf([Per]=5,[Val/ObjCur],0.0])为五月,总和(IIf([Per]=6,[Val/ObjCur],0.0])为六月,\n”
+“金额(IIf([Per]=7,[Val/ObjCur],0.0])为7月,金额(IIf([Per]=8,[Val/ObjCur],0.0])为8月,金额(IIf([Per]=9,[Val/ObjCur],0.0])为9月,\n”
+“总和(IIf([Per]=10,[Val/ObjCur],0.0])作为十月,总和(IIf([Per]=11,[Val/ObjCur],0.0])作为十一月,总和(IIf([Per]=12,[Val/ObjCur],0.0])作为十二月\n”
+“来自tblExportCost\n”
+按tblExportCost.ProjDef、tblExportCost.Year分组\n
+“具有(((tblExportCost.Year)='“+strYear+”)和((tblExportCost.ProjDef)='T3415”+strNumber+”)”;
您可以尝试改用最新版本的UCanAccess(目前为3.0.5)吗?而且,3443.3300000001
看起来像一个浮点值。是否可以使用Access在设计视图中打开[tblExportCost],并确认[Val]和[ObjCur]的列类型?(单?双?货币?…)可能需要用WHERE条款替换HAVING?通常,当您使用它来限制函数时,SQL会试图限制某些字段。另外,不需要在同一字段上分组两次。@jamadei正确。我相信在代码中用[]包围列名可以确保没有其他符号与计算混淆?(无论如何,我认为这是正确的)“我相信在代码中用[]包围列名可以确保没有其他符号与计算混淆?”-是的,没错。很抱歉没有注意到这一点。效果很好,非常感谢您的回答和清晰的解释!