Fail to convert to internal representation

本文探讨了在使用Druid连接池时遇到的Java SQL异常问题,特别是当尝试将VARCHAR类型字段转换为LONG时出现的错误。通过分析OracleResultSetImpl、T4CVarcharAccessor和CharCommonAccessor类的源码,解释了异常发生的根本原因,并提供了解决方案。
摘要由CSDN通过智能技术生成

 今天遇到了这个异常

java.sql.SQLException: Fail to convert to internal representation
	at oracle.jdbc.driver.CharCommonAccessor.getLong(CharCommonAccessor.java:297)
	at oracle.jdbc.driver.T4CVarcharAccessor.getLong(T4CVarcharAccessor.java:849)
	at oracle.jdbc.driver.OracleResultSetImpl.getLong(OracleResultSetImpl.java:939)
	at oracle.jdbc.driver.OracleResultSet.getLong(OracleResultSet.java:440)
	at com.alibaba.druid.pool.DruidPooledResultSet.getLong(DruidPooledResultSet.java:304)
	at cn.egame.data.core.rowmapper.js.OpenChannelSettlementsRowMapper.mapRow(OpenChannelSettlementsRowMapper.java:21)
	at cn.egame.data.core.rowmapper.js.OpenChannelSettlementsRowMapper.mapRow(OpenChannelSettlementsRowMapper.java:14)

 

java代码

        bean.setDistributorId(rs.getLong("distributor_id"));

 这里数据库中distributor_id为varchar2,用getLong去出来

 

此问题非必现,查看数据也没问题

 

来查看下各个类的源码(反编译的,此包非开源)

OracleResultSetImpl

public synchronized long getLong(int var1) throws SQLException {
        if(var1 <= 0 || var1 > this.statement.numberOfDefinePositions) {
            DatabaseError.throwSqlException(3);
        }

        if(this.closed) {
            DatabaseError.throwSqlException(11);
        }

        int var2 = this.statement.currentRow;
        if(var2 < 0) {
            DatabaseError.throwSqlException(14);
        }

        this.statement.lastIndex = var1;
        if(this.statement.streamList != null) {
            this.statement.closeUsedStreams(var1);
        }
        //T4CVarcharAccessor.getLong
        return this.statement.accessors[var1 - 1].getLong(var2);
    }

 

几个类的关系如下

T4CVarcharAccessor extends VarcharAccessor extends CharCommonAccessor

 

如下是CharCommonAccessor.getLong方法

 

long getLong(int var1) throws SQLException {
        long var2 = 0L;
        if(this.rowSpaceIndicator == null) {
            DatabaseError.throwSqlException(21);
        }

        if(this.rowSpaceIndicator[this.indicatorIndex + var1] != -1) {
            try {
                var2 = Long.parseLong(this.getString(var1).trim());
            } catch (NumberFormatException var5) {
                DatabaseError.throwSqlException(59);
            }
        }

        return var2;
    }

 

 

反编译代码如下

/*     */   long getLong(int paramInt)
/*     */     throws SQLException
/*     */   {
/* 273 */     long l = 0L;
/*     */ 
/* 275 */     if (this.rowSpaceIndicator == null)
/*     */     {
/* 279 */       SQLException localSQLException1 = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 21);
/* 280 */       localSQLException1.fillInStackTrace();
/* 281 */       throw localSQLException1;
/*     */     }
/*     */ 
/* 287 */     if (this.rowSpaceIndicator[(this.indicatorIndex + paramInt)] != -1)
/*     */     {
/*     */       try
/*     */       {
/* 291 */         l = Long.parseLong(getString(paramInt).trim());
/*     */       }
/*     */       catch (NumberFormatException localNumberFormatException)
/*     */       {
/* 296 */         SQLException localSQLException2 = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 59);
/* 297 */         localSQLException2.fillInStackTrace();
/* 298 */         throw localSQLException2;
/*     */       }
/*     */ 
/*     */     }

 报错在297行,也就是

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

 

从291行看,网上搜到很多方法说将getLong变为getString,在数据为数字的情况下,个人觉得没有实际意义

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值