使用Java ODBC创建连接会导致java.sql.SQLException:无效的游标类型异常

时间:2014-10-13 11:40:39

标签: java sql jdbc odbc

我正在尝试创建一个访问ODBC数据源的Java程序。使用以下代码......

Connection conn;

try {
    Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
    DriverManager.registerDriver(d);
    String URL = "jdbc:odbc:AR System ODBC Data Source";
    conn = DriverManager.getConnection(URL);
} catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
    Logger.error(this, e);
} 

Statement s = null;
ResultSet rs = null;

try {
    s = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    rs = s.executeQuery("select count(*) as rows from table");

    if (rs.next()) {
        System.out.print("Count of all rows is " + rs.getInt("rows"));
    }
} catch (SQLException e) { 
     e.printStackTrace();
} finally {
    DBUtils.safelyClose(s, rs);
}

...我得到以下例外:

java.sql.SQLException: The result set type is not supported.
   at sun.jdbc.odbc.JdbcOdbcStatement.initialize(Unknown Source)
   at sun.jdbc.odbc.JdbcOdbcConnection.createStatement(Unknown Source)
   at sun.jdbc.odbc.JdbcOdbcConnection.createStatement(Unknown Source)
   at com.csc.remedyarchiver.data.input.ODBCConnection.main(ODBCConnection.java:38)

最初,当我试图自己解决这个问题时,我正在使用空参数createStatement()调用,但这会导致上述异常(因此我使用了TYPE_FORWARD_ONLY结果集类型,但仍然是相同的结果) :

我还有什么可以尝试的,还是需要采用不同的方法呢?

3 个答案:

答案 0 :(得分:1)

从Oracle文档中检索数据集:

  

注意:并非所有数据库和JDBC驱动程序都支持所有ResultSet类型。   如果是,方法DatabaseMetaData.supportsResultSetType返回true   支持指定的ResultSet类型,否则为false。

https://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html

首先,您可能需要检查您的连接是否支持您尝试使用的结果集。

connection.getMetaData().supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY)
connection.getMetaData().supportsResultSetType(ResultSet.CONCUR_READ_ONLY)

以上方法对我的配置都返回true。因此,您发布的代码在我的环境中工作。我敢打赌,其中一个(或两个)将为您返回false,我的猜测是您的数据库本身或您正在使用的Oracle JDBC驱动程序版本存在问题。您可能希望确保使用最新的OJDBC驱动程序,您可以从此处获取:

http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

如果您已经确认使用的是最新的驱动程序,我会验证您正在使用的数据库的版本以及它支持的结果集。

答案 1 :(得分:0)

"选择count(*)作为表格中的行数" 。首先尝试替换" rows"中的别名。到"结果"或者其他的东西 。行是Oracle中保留的关键字之一。除了错误ora 00923

之外,我不认为select会返回任何结果

答案 2 :(得分:0)

是否值得尝试以下内容,首先确认它不受支持,然后再次使用不同的ResultSet类型来查找它?

System.out.println(conn.getMetaData().supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY));