当前位置: 代码迷 >> java >> ResultSet 行计数通过 .getRow() 给出错误的答案与 JDBC-ODBC 和 MS Access
  详细解决方案

ResultSet 行计数通过 .getRow() 给出错误的答案与 JDBC-ODBC 和 MS Access

热度:71   发布时间:2023-07-17 21:02:52.0

我有一个 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 专家,但在我的代码中进行了大量插入、更新和读取查询,访问同一个数据库,似乎一切正常。 无需并发,仅限单用户。

我能够使用 JDBC-ODBC Bridge 和 Access ODBC 驱动程序重新创建您的问题。 两者之间似乎不兼容,我使用 JDBC 驱动程序尝试了完全相同的代码,但得到了正确的结果(“Rowcount=11”)。

JDBC-ODBC Bridge 已过时并已从 Java 8 中删除,因此您无论如何都应考虑切换到 UCanAccess。 有关更多信息,请参阅

  相关解决方案