[转]M$的JDBC驱动的bug

讨论了使用微软SQL Server JDBC驱动时出现的问题,特别是在处理包含Blob或Clob字段的数据时,提出了使用jtds作为替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转至: blogger.org.cn/blog/more.asp

在企业应用中,很少有人用微软的jdbc驱动,这个驱动运行一段时间,没有数据请求时,自动把connection关闭,无论在windows还是linux上。

在一次旧的系统改造中,系统报告了[Microsoft][SQLServer JDBC Driver]ResultSet can not re-read row data for column 10的错误。
为了解决这个问题,开始跟踪程序,就差没有跟踪M$的JDBC源码了,也没有查出原因。只知道在在rs.getString("bkname")的时候,肯定会出现错误。
下面的代码
建表
CREATE TABLE [book] (
  [bkid] int NOT NULL,
  [bkname] nvarchar(200) COLLATE Chinese_PRC_CI_AS NOT NULL,
  [bkintroduction] ntext COLLATE Chinese_PRC_CI_AS,
  [format] nvarchar(10) COLLATE Chinese_PRC_CI_AS,
 
)
ON [PRIMARY]
sql语句
select bkid,bkname,bkintroduction, formatfrom book
java代码
 rs.getString("bkid");
rs.getBinaryStream("bkintroduction");
 rs.getString("bkname");
这个例子,使用微软的驱动,必然会出错。
如果你跟踪的话,必然是这一行:rs.getString("bkname")抛出错误。
 那么,如果你把rs.getString("bkname")和rs.getBinaryStream("bkintroduction");位置互换以下,就可以正常运行。 出现问题的原因,就是微软的驱动,在包含了blob或clob类型的字段,也就是Image和Text类型。
那么就必须按照select顺序查询,且不支持重复查询。
面对这种情况,只有更换驱动了,可以使用jtds,不会存在这种情况。
好像javaunion说过这样的问题,可惜的是,javaunion已经不存在了。
 希望大家尽量不要用微软自带的sqlserver的jdbc驱动。
解决的办法,如果采用微软提供的ms sql server jdbc driver,如果查询语句中,不存在image或text类型字段,那么可以按照无序获取,
如果采用微软提供的ms sql server jdbc driver,如果查询语句中,存在image或text类型字段,那么就必须按照顺序读取,
否则就会报告Driver]ResultSet can not re-read row data for column之类的错误,如果无论查询中有没有image或text类型字段,都要不按照顺序获取,或重复获取。那么就必须更换驱动,使用jtds。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值