问题描述
我有一个 HAM 无线电数据库,我正在尝试计算给定月份(在此示例中为 2014 年 3 月)每个频段联系的国家/地区数量。 我的 SQL 语句在 MS Access 数据库工具中运行良好,但从我的 Java 程序中我只能得到部分结果。 (我看到一个不正确的行数。)
我已经为此苦苦挣扎了几天,但无法让它发挥作用。
这是我的 SQL:
SELECT count(*) AS cdxcc, dxcc, rfband
FROM (SELECT dxcc,ldate,rfband
FROM logbook) AS tmp
where mid(logbook.ldate,4)='03.2014'
GROUP BY dxcc,rfband ORDER BY dxcc;
在 MsAccess(windows 程序)中,我得到了这些正确的结果:
cdxcc dxcc rfband
5 Canada 15m
3 Canada 20m
2 England 40m
18 England 80m
1 Germany 80m
4 Poland 20m
1 Scotland 80m
1 Sweden 20m
1 USA 12m
12 USA 15m
1 Wales 60m
但是,在我的 Java 程序中,我只返回与第一条记录中的“cdxcc”计数一样多的行,在本例中为 5。所以我只得到前 5 行,然后是 SQL/ java 错误('ResultSet 已关闭')。
对于不同的月份,第一行的计数可能为 1,而我只得到 1 条记录。 作为调试,我在 stackoverflow 上找到了这个方便的代码,它确认了 5,这是错误的。 这个例子的正确答案应该是 11:
if (rs.last()) {
rowcount = rs.getRow();
rs.beforeFirst();
}
有没有人认识到这个问题并知道解决方案?
确实查询太复杂了,这也有效,但不幸的是结果相同:
SELECT count(*) AS cdxcc,dxcc,rfband,ldate FROM logbook AS tmp where mid(ldate,4)='03.2014' GROUP BY dxcc,rfband,ldate ORDER BY dxcc;
不幸的是,同样的错误结果。
我的代码中有很多其他 SQL 语句,它们都可以正常工作,仅此而已。 Java 代码在这里(try-catch 和其他非必要代码省略):
private static final String accessDBURLPrefix = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=";
private static final String accessDBURLSuffix = ";DriverID=22;READONLY=false}";
String currdb=accessDBpath + logbookdb; // path and filename of .mdb file
private Statement stm = null;
private ResultSet rs=null;
private Connection dbconn = null;
String dbDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(dbDriver);
String dbURL = accessDBURLPrefix + currdb + accessDBURLSuffix;
dbconn = DriverManager.getConnection(dbURL,"","");
stm = dbconn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
// This function is called by a JSP page that contains the aforementioned query
public boolean dbQuery(String q) {
rs = stm.executeQuery(q);
int rowcount = 0;
if (rs.last()) {
rowcount = rs.getRow();
rs.beforeFirst();
}
System.out.println("Rowcount="+ rowcount);
return true;
}
我不是 SQL 专家,但在我的代码中进行了大量插入、更新和读取查询,访问同一个数据库,似乎一切正常。 无需并发,仅限单用户。
1楼
我能够使用 JDBC-ODBC Bridge 和 Access ODBC 驱动程序重新创建您的问题。 两者之间似乎不兼容,我使用 JDBC 驱动程序尝试了完全相同的代码,但得到了正确的结果(“Rowcount=11”)。
JDBC-ODBC Bridge 已过时并已从 Java 8 中删除,因此您无论如何都应考虑切换到 UCanAccess。 有关更多信息,请参阅