Java.sql.SQLException:转换为内部表示异常失败

4
请看下面的查询:
select nvl(max(transaction_id),0) as  transaction_id from exception_details;

如果我通过我的JDBC代码执行上述查询,它会给我一个java.sql.SQLException: Fail to convert to internal representation错误提示。我的JDBC代码如下:

public int fetchColumnVal(String query) throws SQLException, IllegalAccessException, 
    InvocationTargetException, NoSuchMethodException, ClassNotFoundException, InstantiationException {

    PreparedStatement pstmt = null;
    Connection con = null;
    try {
        con = getConnection(true);
        pstmt = con.prepareStatement(query);
        ResultSet rs = pstmt.executeQuery();
        rs.next();
        int count=rs.getInt(1);
        return count;
    } finally {
        if (isBatchMode) {
            this.cleanResources(null, pstmt);
        }
        else {
            this.cleanResources(con, pstmt);
        }
    }
}

该表中列transaction_id的数据类型为NUMBER。


尝试使用getBigDecimal或getLong代替getInt。 - vzamanillo
我尝试使用getBigDecimal(),但仍然出现相同的错误,并且查询的输出为0,所以我是否应该尝试使用getLong()? - Vinda
请问您能否提供完整的错误跟踪信息吗? - vzamanillo
1
错误提示表明您正在选择一个 varchar2 类型的变量;您能否再次确认一下 transaction_id 是否确实定义为 number 类型(我知道您已经说过了,但还是要确认一下),并且这是否是导致错误的查询语句?在执行查询之前,您至少可以记录/显示 query 的值以验证您要运行的内容吗?(它肯定不会完全相同 - 结尾的分号会导致错误)。 - Alex Poole
4个回答

3

如果您在使用@Enumerated时没有定义EnumType.STRING,即 @Enumerated(EnumType.STRING) 并且您的表已经包含字符串数据(Varchar),那么您将会遇到此错误, 因为默认的EnumType是ORDINAL,即EnumType.ORDINAL。


0
我想建议一种更传统的方法来检查ResultSet计数。 最初,我尝试使用:

       while (RS.next()) {
            RScount = RS.getInt(1);
            Set.add(RS.getString(1));
        }

但是由于我的SQL结果集是字符串,Java一直抛出异常:

java.sql.SQLException: Fail to convert to internal representation

然后我将我的代码更改为普通的Vanilla: 声明,在0处初始化:

Integer RScount = 0; //SQL result set counter

计数器代码如下:

    while (RS.next()) {
        RScount++;
        Set.add(RS.getString(1));
    }

0

SQL JDBC/Java setXXX getXXX

NUMERIC java.math.BigDecimal setBigDecimal getBigDecimal

将 rs.getInt(1); 改为 rs.getBigDecimal(1);

(或) 对于 Oracle,在 SQL 中像下面这样将数字强制转换为整数:

CAST(id AS integer)


你好,根据你上面的解决方案,我尝试在我的代码中实现相同的方法BigDecimal count=rs.getBigDecimal(1); 但仍然出现相同的异常。 - Vinda
你能否在select查询中将列转换为整数类型,并保留代码rs.getInt(1);并尝试执行? - Balaji Sengeni
你能检查一下nvl函数的语法吗?请参考以下Oracle链接:http://www.techonthenet.com/oracle/functions/nvl.php。从exception_details表中选择cast(nvl(max(transaction_id),0) as integer) as transaction_id。[还要检查nvl函数的第一个参数,它需要一个字符串作为输入] - Balaji Sengeni

0

我遇到了以下错误:

异常信息:java.sql.SQLException: 无法转换为内部表示。

我的代码如下:

 while(res.next())  
        System.out.println(  res.getInt(1) + "  "
                           + res.getString(2) + "  "
                           + res.getString(3) + "  "
                           + res.getString(4));

但是我的数据库中第一个字段的数据类型是varchar类型。

然后我将我的代码更改为:

while(res.next())  
        System.out.println(  res.getString(1) + "  "
                           + res.getString(2) + "  "
                           + res.getString(3) + "  "
                           + res.getString(4));

然后我获取了所有的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接