我在oracle 9i的一个项目上工作。我在使用toplink 10.1.3加载表中的特定行时遇到问题。事实证明,toplink所依赖的jdbc驱动程序非常有趣。也许这里有人可以提供帮助...
我有一个名为:crazytable的表。它有一列:“ver_num number(19)not null default 0”。几年前,该列作为原始插入的一部分添加到表中。当我从crazytable中选择任何记录(参见下面的jdbc连接代码)并尝试执行rs.getLong(colIndex)时,一切正常。但是,如果我执行rs.getObject(colIndex),我会得到一个stacktrace:
java.lang.ArrayIndexOutOfBoundsException: 1
at oracle.sql.NUMBER.toBigDecimal(NUMBER.java:651)
at oracle.jdbc.dbaccess.DBConversion.NumberBytesToBigDecimal(DBConversion.java:2805)
at oracle.jdbc.driver.OracleStatement.getBigDecimalValue(OracleStatement.java:4539)
at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5666)
at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5622)
at oracle.jdbc.driver.OracleResultSetImpl.getObject(OracleResultSetImpl.java:739)
at oracle.jdbc.driver.OracleResultSet.getObject(OracleResultSet.java:1470)
stacktrace truncated to protect my poor code...
我可以使用另一个表,让我们调用它:sanetable,并对具有相同名称和类型“ver_num number(19)not null default 0”的列运行相同的查询。而rs.getLong(colIndex)和rs.getObject(colIndex)工作得很好。
任何一列都不涉及约束或索引。我已经尝试过oracle驱动程序9.2.0.8,9.2.0.5,9.2.0.1,甚至10. *(这都行不通)。
有谁知道我能在这做什么?
这是我的基本连接代码。成功调用之间的唯一区别是所讨论的特定表:
Class.forName(oracle.jdbc.OracleDriver.class.getName());
String url = "jdbc:oracle:thin:@IPADDRESS:PORT:INSTANCE";
Connection conn = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection(url, "user","pass");
PreparedStatement prepareStatement = conn.prepareStatement(
"select distinct ver_num " +
"FROM [crazytable|sanetable] "
);
rs = prepareStatement.executeQuery();
assertNotNull(rs);
while (rs.next()) {
ResultSetMetaData md = rs.getMetaData();
for (int i = 1; i <= md.getColumnCount(); i++) {
String key = md.getColumnLabel(i);
Object value = rs.getLong(key);
System.out.println(key+" : "+value
+" was null: "+rs.wasNull()
+" type: "+ rs.getType()
+" class: "+ md.getColumnClassName(i));
}
}
} finally {
if (rs != null) {
rs.close();
}
if (conn != null) {
conn.close();
}
}
编辑:可以在此页面上找到该驱动程序:http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html
答案 0 :(得分:0)
好吧,我想我想出来了。我正在查看其他一些问题并注意到还有其他oracle 4型驱动程序。其中之一是DataDirect(http://datadirect.com)。我使用了他们的驱动程序的试用版,它能够返回rs.getObject(intIndex)。
该值为:-1.6777120E-27。
所以rs.getLong()向下舍入为零,但BigDecimal看到一个小数部分并抛出异常。
也许这是因为oracle的驱动程序是用jdbc1.4 vs编译的,对于datadirect来说是更新的。