SQL Server存储过程读取图片列报错:The data has been accessed...
问题:访问SQL Server图片列时抛出数据不可用异常
执行存储过程后能获取结果集,但访问特定图片列时抛出如下异常:
com.microsoft.sqlserver.jdbc.SQLServerException: The data has been accessed and is not available for this column or parameter. at com.microsoft.sqlserver.jdbc.ServerDTVImpl.getValue(dtv.java:3712) ~[sqljdbc_1.2.jar:?] at com.microsoft.sqlserver.jdbc.DTV.getValue(dtv.java:247) ~[sqljdbc_1.2.jar:?] at com.microsoft.sqlserver.jdbc.Column.getValue(Column.java:190) ~[sqljdbc_1.2.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getValue(SQLServerResultSet.java:2053) ~[sqljdbc_1.2.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getValue(SQLServerResultSet.java:2048) ~[sqljdbc_1.2.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getStream(SQLServerResultSet.java:2067) ~[sqljdbc_1.2.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getBinaryStream(SQLServerResultSet.java:2140) ~[sqljdbc_1.2.jar:?]
解决办法
- 升级JDBC驱动:当前使用的sqljdbc_1.2.jar版本过旧,存在大字段读取的兼容性问题,直接替换为最新版的Microsoft SQL Server JDBC驱动(如mssql-jdbc-12.x及以上版本)
- 调整列读取顺序:读取结果集时,先读取所有非大字段列,最后读取图片这类大二进制列,不要跨列读取或优先读取大字段
- 切换结果集类型:将结果集类型设置为
Statement.TYPE_FORWARD_ONLY,避免因可滚动结果集的缓存机制导致数据提前释放 - 关闭自动提交:在数据库连接中执行
conn.setAutoCommit(false),部分场景下自动提交会触发大字段数据的资源回收
内容的提问来源于stack exchange,提问作者sathish kumar
相关产品推荐
相关产品推荐

