用MS SQL2000遇到这样的问题了,我所采用的ms sql的驱动是官方的.在网上查了一下,感觉说得零零散散,模模糊糊,有错有对.真是鱼龙混杂,感觉像进了市场买菜.......我尽我的掌握和有限的水平综合起来总结一下:
这个问题的原因是只要表里有Blob或者Clob两个当中的一种或者这两个字段都存在,并且采用MS SQL官方的驱动.就会产生这个错误!并且查看了很多资料,很多总结都指出这种错误仅MS SQL2000才会出现.
网上总结的微软驱动的缺点及解决方案: 数据库表:TChannle
(1)如果采用jdbc-odbc驱动,那么就必须按照查询顺序来一次读取(不论有没有image或text类型)
(2)如果采用微软提供的ms sql server jdbc driver,如果查询语句中,不存在image或text类型字段,那么可以按照无序获取
(3)
如果采用微软提供的ms sql server jdbc
driver,如果查询语句中,存在image或text类型字段,那么就必须按照顺序读取,否则就会报告Driver]ResultSet can
not re-read row data for column之类的错误
(4)如果想不查询语句中有没有image或text类型字段,都可以不按照顺序获取,或重复获取。
上面四点,什么算是无序获取和顺序获取?我迷糊半天,又查了半天,查到一个例子:
数据库表:TestTable
表字段及类型:
guid char(38)
title varchar(100)
content Text
username varchar(20)
查询sql语句:
select guid,username,content,title from TestTable where····
java代码:
rs.getString("guid");
rs.getBinaryStream("content");
rs.getString("username");
-----------------------------------------------------------
上面那段代码,很不荣幸是。使用微软的驱动,必然会报错(就是上面说的那个错误)。如果你跟踪的话,必然是这一行:rs.getString("username")抛出错误。
那么,如果你把rs.getString("username")和rs.getBinaryStream("content");位置互换以下,会怎么样呢。结果就是可以正常运行。
为什么会出现这种情况呢,因为微软的驱动,在包含了blob或clob类型(就是Image和Text类型)的字段。那么就必须按照select顺序查询,且不支持重复查询。
还有重复查询,又是什么意思?再举个例子:
表字段及类型:
chanleid主键 int自增
chanName频道名称 varchar
creatTime varchar
creatUserName varchar
所谓重复查询的语句:
select chanName, chanName, chanName from TChannle
可以查出三个频道名称,即chanName.这就是重复查询!
如何解决这个问题呢?
(1) 使用Sql Server 2000的第三方驱动就没有这样的问题存在。网上说找到jTDS取代微软的SQLServer2000的JDBC驱动.
要使用jTDS驱动,配置要做一些变动:
数据库URL:jdbc:jtds:sqlserver://localhost:1433;DatabaseName=XXX
驱动类:net.sourceforge.jtds.jdbc.Driver
jtds驱动的下载地址:http://sourceforge.net/projects/jtds/
(2)hibernate映射文件里面不映射CLOB或者BLOB字段,当遇到CLOB或者BLOB字段时,直接映射成String类型的,MS SQL数据库会自动转成text类型的.
分享到:
相关推荐
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data for column 5的解决方案
ResultSet的用法
ResultSet 转为listmap
JDBC规范 java.sql和javax.sql两个包中的类与接口(天龙八部): DataSource:数据源 ... ResultSet:结果集,封装了多条记录 JDBC数据库连接池/Connection Pool DBCP:apache tomcat内置
ResultSet直接在JTable显示
java数据库连接ResultSet
* @return a <code>ResultSet</code> object that contains the data produced * by the given query; never <code>null */ public ResultSet executeQuery(String sql) { try { Statement statement = ...
resultset 变成 XML 格式输出
在java开发中常需要将ResultSet结果集转化为json格式以实现与客服端实现数据交互,但是这需要几个包,而且版本也要对应,因此我收集了全部的包,并测试可以运行,放在这里供大家下载。包括:commons-beanutils-1.7.0...
能够使用Spring Boot提供的@ConfigurationProperties ( spring.datasource.hikari.* , spring.datasource.dbcp2.* ) 通过部署属性decorator.datasource.enabled=true/false禁用装饰 通过spring属性applica
Blog-Art.-09-Java-ResultSet-To-List 将ResultSet转换为Map对象的列表。 JdbcUtil类与静态方法一起使用。 该项目是使用NetBeans 8开发的。 环聊SpringMVC: ://youtu.be/clBK-R8LChM Spring-MYBATIS: ://youtu.be...
本文档演示如何从 Java 存储过程将 JDBC ResultSet 作为 REF CURSOR 返回。JDBC ResultSet 是一个表示数据库的数据表,通常通过执行查询数据库的语句产生该表。REF CURSOR 是 PL/SQL 中相应的类型。Java 存储过程的...
此代码实用程序会将任意数量的结果集转换为单个 xml 文件。 执行的主要方法是 XMLWriter.writeXML。
可更新的 ResultSet 对象具有一个与其关联的特殊行,该行用作构建要插入的行的暂存区域 (staging area)。以下代码片段将光标移动到插入行,构建一个三列的行,并使用方法 insertRow 将其插入到 rs 和数据源表中。
这是一个用来教你如何使用ResultSet 获取数据对象的文档,非常使用
JAVA 版本ResultSet 转换为JAVABEAN的工具类
获得结果集的字段名称,ResultSet的属性要调用ResultSetMetaData的方法
jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程
2.封装通用增删改 2.1.封装JDBCUtil 2.2.封装Dao通用增删改 2.3.测试 3.ResultSet与ResultSetMetaData 4.查询对象映射Map 4.1.封装queryMap() 4.2.测试 5.查询结果集映射ListMap 5.1.封装queryListMap() 5.2.测试 6....
下列关于 TCP Socket 通信原理描述,错误的是( ) 。 A. IP 协议是网络层的核心协议 B. TCP 和 UDP 协议都属于传输层协议 C. TCP 协议和 IP 协议都是面向连接的协议 D. UDP 协议和 IP 协议都是无连接的协议 ------...