Microsoft JDBC "ResultSet Can Not Re-Read Row Data" Error解决办法

http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=123&threadID=27318&tstart=0
先k一下M$
使用MS SQL Server 2000 SP3a做数据库服务器时,用Microsoft提供的JDBC驱动(2.2.0040),在查询时遇到一个SQLException:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data for column #.
查询语句和JDBC代码都没有问题,怀疑是Microsoft驱动的BUG,google一下果然在Microsoft support站点发现了问题:http://support.microsoft.com/kb/824106
原因是如果该表存在TEXT, NTEXT, IMAGE等大型字段,对于ResultSet的字段读取必须按照从左向右读,如果你用:
int a = rs.getInt(2);
int b = rs.getInt(1);
则报错。
Microsoft给出的方案是不能从右往左也不能连续读2次。没办法自己改代码,严格从左向右读,结果就没有问题了。

后来用sql server 2000 sp4 + ms jdbc driver sp3测试依然有这个BUG估计Microsoft故意不肯解决这种BUG。
<think>嗯,用户遇到了“JDBCResultSetnot foundin namespace”的问题,这通常发生在MyBatis配置或使用过程中。首先,我需要回忆一下MyBatis的相关知识。MyBatis在映射结果集时,主要依赖于`ResultMap`配置,而不是直接使用JDBC的`ResultSet`对象。用户可能在代码或配置文件中错误地引用了`JDBCResultSet`,导致命名空间找不到这个类。接下来,我应该检查用户可能的错误点。首先,用户可能在`resultType`属性中错误地指定了`JDBCResultSet`,而实际上应该使用Java实体类或者基础类型。例如,正确的`resultType`应该是`com.example.User`而不是`JDBCResultSet`。其次,检查是否导入了错误的类,MyBatis处理结果集时不需要直接使用`ResultSet`,而是通过`ResultMap`进行映射。然后,解决方案方面,第一步是检查XML配置文件中的`resultType`或`resultMap`是否正确。确保`resultType`指向的是实体类,并且该类已经被正确导入。如果使用了`ResultMap`,则需要确认`<resultMap>`的定义是否正确,属性与数据库列是否对应。此外,检查是否有拼写错误或全限定类名是否正确。 另外,用户可能在代码中错误地处理了结果集,比如尝试直接操作`ResultSet`,而MyBatis已经自动完成了这一过程。应该提醒用户遵循MyBatis的规范,使用接口映射和`ResultMap`来避免直接接触底层的JDBC对象。 最后,验证解决方案的有效性,建议用户清理项目并重新构建,确保配置更改生效。如果问题依旧,可能需要检查依赖是否正确,特别是MyBatis和JDBC驱动的版本是否兼容。同时,提供相关的问题示例和参考引用,帮助用户进一步理解如何正确配置`ResultMap`。</think>### JDBCResultSet命名空间问题解决方案 #### 问题分析 错误提示`JDBCResultSet not found in namespace`通常出现在MyBatis配置或SQL映射文件(如`mapper.xml`)中,具体原因可能有: 1. **错误引用JDBC类**:在`resultType`或`resultMap`中尝试直接使用JDBC的`ResultSet`类(如`java.sql.ResultSet`),而MyBatis要求映射到Java实体类或基本类型[^1]。 2. **未正确配置ResultMap**:在`<resultMap>`中未定义字段与Java属性的映射关系,导致MyBatis无法自动解析结果集。 --- #### 解决方案步骤 ##### 1. 检查`resultType`配置 在SQL映射文件中,确保`resultType`指向具体的Java实体类或基础类型(如`String`、`Map`),而非JDBC类: ```xml <!-- 错误示例 --> <select id="getUser" resultType="java.sql.ResultSet"> SELECT * FROM user </select> <!-- 正确示例 --> <select id="getUser" resultType="com.example.User"> SELECT id, name FROM user </select> ``` ##### 2. 显式定义`<resultMap>` 通过`<resultMap>`明确字段与属性的映射关系: ```xml <resultMap id="userResultMap" type="com.example.User"> <result column="id" property="id" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> </resultMap> <select id="getUser" resultMap="userResultMap"> SELECT id, name FROM user </select> ``` ##### 3. 验证类路径和导入 - 确保实体类`com.example.User`存在于项目中,且包路径与配置一致。 - 检查MyBatis核心配置文件中是否正确定义了类型别名(简化配置): ```xml <typeAliases> <typeAlias type="com.example.User" alias="User"/> </typeAliases> ``` ##### 4. 清理缓存并重新构建 - Maven项目执行`mvn clean install`。 - IDE中清理缓存(如IntelliJ的`File > Invalidate Caches`)。 --- #### 相关问题 1. **如何解决MyBatis中`Unknown column 'xxx' in 'field list'`错误?** *检查数据库字段名与`<resultMap>`的`column`属性是否一致,注意大小写敏感性问题。* 2. **MyBatis中`resultType`和`resultMap`有什么区别?** *`resultType`直接映射到简单类型或实体类,`resultMap`用于复杂映射关系[^1]。* 3. **为什么MyBatis返回的数值类型字段为`null`?** *检查JDBC类型(如`jdbcType=INTEGER`)是否与数据库字段类型匹配,避免类型不兼容[^1]。* --- #### 引用说明 [^1]: MyBatis通过`ResultMapping`封装字段映射关系,需确保`column`和`property`正确对应。 [^2]: 核心配置文件需正确定义数据源和映射文件路径,否则会导致类加载失败。 [^3]: 客户端代码中应避免直接操作JDBC对象,遵循ORM框架规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值