微软看到这个标题,肯定不高兴了。不过说实话,在商业应用中,很少有公司真正实用微软的那个什么com.microsoft.jdbc.sqlserver.SQLServerDriver。
其实发现微软驱动的不足,也是很偶然的机会。在一次移植应用中,系统报告了[Microsoft][SQLServer JDBC Driver]ResultSet can not re-read row data for column之类的错误。为了解决这个错误,跟踪程序忙了大半天,也没有查出问题所在。只能确定在在rs.getString("XXX")的时候必然会出现错误(rs为ResultSet对象)。那么现在就模拟以下当时的环境:
数据库表: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顺序查询,且不支持重复查询。
面对这种情况,只有更换驱动了。国外第三方的驱动很多,比如JSQLConnect,JTurbo等等。这些都是商用的,需要付费,不够有试用版本。如果希望有个免费的,可以在www.freetds.com上获取一个免费的(我没有测试过这个免费驱动,不知道是否会存在这种情况)。
有关最初的说明,可以参考[javasearch]
http://www.javaresearch.org/article/showarticle.jsp?column=2&thread=4278]
或[javaunion](很遗憾的是,javaunion已经不存在了)
http://www.javaunion.org/bbs/cgi-bin/topic.cgi?forum=1&topic=15516&show=0
其实今天想说的这篇文档真的有些老了。早在曾经的javaunion还存在的时候就谈过这样的问题了。今天突然又贴出来,只是偶然间发现了数据库板块中的“SQLServer2000 JDBC驱动的完整安装及测试说明”这篇文档。我以为会有些什么值得参考的东东,结果大失所望(文章很适合入门型的参考,从这一点上写的还是可以的)。不过,拿来商业性应用中,就有些幼稚了。
希望大家慎用或尽量不要用微软自带的sqlserver的jdbc驱动。
如果有什么疑问,或有错误地方,请斧正。可以发邮件,相互交流。
作者:银狐999(james999)
信箱:james-fly@vip.sina.com
===============================================
接受blundblade兄弟的建议,补充如下:
(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类型字段,都可以不按照顺序获取,或重复获取。那么就必须更换驱动,改用第三方的。
分享到:
相关推荐
*的分公司的风格大方g放到空间上的开发建设随碟附送
Oracle同步数据到Sql Server,只是初始加载过程,由于本人也是在学习阶段,本资料主要是用于备份,慎入!
字段设计应注意数据类型的选择,优先使用数字型,避免NULL,缩小数据类型,避免TEXT和IMAGE,慎用自增字段,以利于数据迁移。 6. 物理存储与环境设计 规划文件组分布,利用多硬盘分散I/O操作,优化操作系统环境和...
游标在SQLSERVER中用于逐行处理结果集,但通常应尽量避免使用,因为它们可能导致性能下降。只有在必须按顺序处理数据或进行多次更新时才考虑使用。示例中的游标使用: - `FETCH MYCURSOR INTO @VCOUNT_NO` 用于将...
f) **大表连接和修改**:慎用大型临时表与其他大表的连接查询和修改,以减轻tempdb的系统表负担。 6. **算法选择**: 结合SQL优化技术,参照ASE Tuning手册,对比多种算法,选择资源消耗最少、效率最高的方法。...
4. **慎用OR连接条件**:多个`OR`条件可能导致索引失效。推荐使用多个查询语句并用`UNION ALL`合并结果。 5. **合理使用IN和NOT IN**:使用`IN`或`NOT IN`可能导致全表扫描,特别是当列表很长时。对于连续的数值...
18. **使用`DISTINCT`关键字**:当需要去除重复记录时,使用`DISTINCT`关键字,但在大表上慎用,因为这可能导致额外的排序和去重开销。 19. **优化`UNION`操作**:使用`UNION ALL`替代`UNION`,除非确实需要去除...
"SQL Server数据库性能优化" SQL Server数据库性能的优化是数据库应用系统开发中的一个重要...合理的数据库设计、慎用游标、索引的使用、查询优化、数据库碎片整理、数据库备份和恢复等都是数据库性能优化的重要手段。
在SQL Server中,进行多表关联查询时,我们通常会编写复杂的WHERE子句来过滤数据。然而,当我们在这些关联条件中使用TRIM()函数时,可能会对查询性能产生显著影响,尤其是在处理大量数据时。这里我们将深入探讨这个...
IN和NOT IN操作符也需要慎用,否则会导致全表扫描。可以使用EXISTS代替IN操作符,以提高查询效率。 六、避免使用LIKE操作符 在where子句中,尽量避免使用LIKE操作符,特别是使用通配符%。可以使用全文检索来提高...
SQL和MSDE清理小程序(慎用),SQL和MSDE清理小程序(慎用),SQL和MSDE清理小程序(慎用),
server数据库服务器安全1友好的错误提示页,不出错误黄页,会暴露信息2输入参数检测,get,post,cookie验证,防注入3页面层不含任何业务逻辑4fck等编辑器有安全漏洞,慎用5.net开发除了在页面层对所有输入要防注入外...
加密的惨剧!慎用文件夹加密软件! 加密的惨剧!慎用文件夹加密软件!
- "Rowcount"显示表行数,但大表时慎用,避免长时间无响应或内存溢出问题。 - SQL窗口执行查询,结果可导出为CSV、XML等格式。 ### 注意事项 7. **查询限制**:执行SQL时,尽可能加上`LIMIT`子句,防止返回大量...
把要删除的文件拖到这个文件上面即可。注意,这是强力删除。一定慎用,因为连垃圾箱都会没有的。
有很多用户没有使用过360驱动大师不知道它有什么作用或是功能,其实它有很慎迅多强大的功能,不仅有云颂源安全中心可以让用户放心安装还有驱动自动更新等等。 360驱动大师有什么用: 1、它可以帮助用户对电脑进行...
从Jdk6.0以后要求,JDBC 4.0 Drivers 必须包括 META-INF/services/java.sql.Driver 文件,有了这个文件以后不需要在显示的使用Class.forName来进行驱动的注册 Oracle数据库进行连接的时候,使用的驱动类: 1....
易语言处理事件命令慎用时钟版源码,处理事件命令慎用时钟版