`
feirou520
  • 浏览: 119157 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

关于ResultSet can not re-read row data for column 2 错误及其原因

    博客分类:
  • jtds
阅读更多

用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类型的.

分享到:
评论

相关推荐

    sqlserver2000re_read错误的解决

    在使用Java连接SQL Server 2000数据库时,可能会遇到`java.sql.SQLException: [Microsoft][SQL Server 2000 Driver for JDBC] ResultSet cannot re-read row data for column X`这样的异常。这个问题通常是由于SQL ...

    ResultSet对象获取数据的各种方法

    ### ResultSet对象获取数据的各种方法 在Java编程语言中,`ResultSet`对象是处理数据库查询结果的核心组件之一。它充当一个可滚动的、可更新的数据表,用于存储从数据库执行SQL语句后返回的结果集。本文将详细介绍...

    ResultSet

    例如,`resultSet.getInt(1)`或`resultSet.getString("columnName")`。 4. 遍历结果集:为了完整遍历ResultSet,你需要在while循环中使用next()方法,直到它返回false为止。示例代码如下: ``` while (resultSet....

    支持ResultSet的JTable

    2. **SQL查询**:执行`Statement`或`PreparedStatement`对象的`executeQuery()`方法来执行SQL查询,这会返回一个`ResultSet`对象。 3. **处理ResultSet**:`ResultSet`是一个游标,可以按照顺序读取查询结果。我们...

    java resultset常用方法

    ### Java ResultSet 常用方法详解 #### 一、ResultSet 类型概述 在Java的JDBC编程中,`ResultSet`接口用于表示从数据库查询中获取的结果集。它提供了多种方式来处理这些数据,并且根据不同的应用场景,支持不同类型...

    ResultSet的属性

    ResultSetMetaData是另一个关键接口,它提供了关于ResultSet中列的元数据信息。例如,你可以通过ResultSetMetaData来获取列的数量、列的名称、列的类型、列的宽度、是否可以用于WHERE子句等等。这些信息对于正确地...

    关于ResultSet的相关知识

    ResultSet是Java数据库连接(JDBC)中用于处理查询结果的核心接口。它代表了从数据库查询返回的数据集,允许程序员逐行地访问和操作这些数据。本文将深入探讨ResultSet的两个关键特性:更新当前行的列值和使用插入行...

    MyEclipse 使用第三方驱动JTDS链接数据库

    在遇到使用微软官方驱动时出现的问题,如“ResultSet cannot re-read row data for column”这类错误时,可以选择切换到JTDS驱动来解决。 首先,你需要从源码仓库下载JTDS驱动的最新版本,例如jtds-1.2.2.jar。由于...

    javaResultSet常用方法.pdf

    Java ResultSet常用方法 Java ResultSet是Java数据库连接(JDBC)中最重要的组件之一,用于存储和处理数据库查询结果。在Java中,ResultSet对象是通过Statement对象的executeQuery()方法或prepareStatement()方法...

    java数据库连接ResultSet

    Java 数据库连接 ResultSet Java 数据库连接中的 ResultSet 是一个非常重要的概念,它包含符合 SQL 语句中条件的所有行,并且提供了对这些行中数据的访问。ResultSet 通过一套 get 方法访问当前行中的不同列,例如 ...

    oracle-export-data-into-excel-file.rar_DEMO_excel oracle

    标题中的“oracle-export-data-into-excel-file.rar_DEMO_excel oracle”表明这是一个关于将Oracle数据库中的数据导出到Excel文件的示例项目。这个DEMO适用于那些希望通过编程方式实现这一功能的初学者。标签“demo ...

    java中常见的错误.docx

    9. 类型错误:`Data truncated for column 'gatheringMoney' at row 1`表明尝试将不符合列定义的数据类型的数据插入列中。 10. 数据库连接池问题:`Name java: is not bound in this Context`可能是因为JNDI查找...

    Spring Data JDBC与JDBC的区别

    Spring Data JDBC与JDBC是两种不同的数据库访问方式,它们在Java开发中有着广泛的应用。JDBC(Java Database Connectivity)是Java平台的标准API,用于与各种数据库进行交互。它提供了低级别的数据库操作,如建立...

    ResultSet 转为listmap

    ResultSet 转为 List ResultSet 转为 List<Map> 是一种常见的数据处理操作。在 Java 中,使用 JDBC 连接数据库时,通常会返回一个 ResultSet 对象,该对象包含了查询结果集的所有记录。为了方便数据处理和使用,...

    poi根据ResultSet到处Excle源码

    标题中的“poi根据ResultSet到处Excle源码”指的是使用Java的Apache POI库将数据库查询结果(ResultSet)转换为Excel文件的过程。Apache POI是一个流行的API,它允许开发者读写Microsoft Office格式的文件,包括...

    ResultSet转化为json,json转化为List

    在Java编程中,数据处理是核心任务之一,而ResultSet、JSON和List是处理数据时常见的三种数据结构。ResultSet是数据库查询结果的载体,JSON是一种轻量级的数据交换格式,而List是Java集合框架中的动态数组。本文将...

    java 代码笔记 2010-06-23 对ResultSet()的几个常用操作,实例。

    本篇笔记将深入探讨2010年6月23日记录的一些关于ResultSet的常用操作,结合实例进行讲解。 1. 创建与初始化 在Java中,我们通常通过Statement或PreparedStatement对象的executeQuery()方法执行SQL查询来获取...

    ResultSet常用方法

    - `rs.updateXXX(int column, XXX data)` 和 `rs.updateXXX(String columnName, String data)`:更新当前行指定列的值,其中XXX代表不同的数据类型,如int、double、String、Date等。 - `rs.updateRow()`:更新...

    ResultSet to XML Converter-开源

    6. 错误处理:在转换过程中,XMLWriter可能会捕获并处理可能的异常,例如文件I/O错误或数据转换错误。 开源软件的优势在于,开发者可以自由地查看、使用、修改和分发源代码。对于"ResultSet to XML Converter",这...

    oracle 错误合集

    以上错误列表总结了 Oracle 数据库中可能出现的一些常见错误及其可能的原因。针对每个错误码,了解其含义可以帮助开发者和数据库管理员快速定位问题所在,并采取适当的措施来解决这些问题。在实际应用中,还应该结合...

Global site tag (gtag.js) - Google Analytics