《美人依旧》- -| 回首页 | 2005年索引 | - -冲淡而已

jTDS与Microsoft JDBC查询text类型时的区别-转自王伟东blog

                                      

根据jTDS native type mapping

Character type
  char       java.lang.String  CHAR  
  varchar    java.lang.String  VARCHAR  
  nchar      java.lang.String  CHAR  
  nvarchar   java.lang.String  VARCHAR  
  unichar    java.lang.String  CHAR           Sybase only
  univarchar java.lang.String  VARCHAR        Sybase only
  text       java.sql.Clob     LONGVARCHAR  
  ntext      java.sql.Clob     LONGVARCHAR    Microsoft only


 

由上可见jTDS的text的结果集返回为Clob类型,但在Microsoft JDBC返回结果集为String类型,所以两者不同。


:为什么用jTDS对于text字段应用rs.getString(int) 时也是正确的。
:其实是有区别的,区别是当text字段存储的内容还不够长时得到的结果可能是对的,但是过长时就不对了,查看出错信息是length()错误,经分析原因应该是默认应用rs.getString(int)相当于以下操作   
 .......  
 Clob clob = rs.getClob(col);
 return (clob == null ? null : clob.getSubString(1, (int)  clob.length()));
 ....
clob.length()返回是long型,参见getSubString函数的入口参数getSubString(long,int),第二个参数是int类型,所以当clob.length()超长时进行(int)强制转换结果必然出错。
解决方法
protected String helper(ResultSet rs, int dataType, int col) {
  String retVal = "";
  try {
   switch (dataType) {
  ...
     case Types.Clob:  
       retVal = getClobString(rs,col);
       break;
 }
 catch(){ ...
 }
 finally{
 return retVal;
 }
}
public String getClobString(ResultSet rs, int col) {
  try {
   Reader reader = rs.getCharacterStream(col);
   if (reader == null) {
    return null;
   }
   StringBuffer sb = new StringBuffer();
   char[] charbuf = new char[4096];
   for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {
    sb.append(charbuf, 0, i);
   }
   return sb.toString();
  } catch (Exception e) {
   return "";
  }
 }

【作者: eatrice】【访问统计:】【2005年03月8日 星期二 19:30】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=895892

回复

- 评论人:六   2006-12-07 16:30:38   

* 当数据库字段为Text类型时调用
* @param rs
* @param col
* @return
*/

public static String getClobString(ResultSet rs, String col) {
try {
Reader reader = rs.getCharacterStream(col);
if (reader == null) {
return null;
}
StringBuffer sb = new StringBuffer();
char[] charbuf = new char[4096];
for (int i = reader.read(charbuf); i 〉 0; i = reader.read(charbuf)) {
sb.append(charbuf, 0, i);
}
return sb.toString();
} catch (Exception e) {
return "";
}
}
}
这个代码你是怎么调用的,我怎么没有看明白呢 回复我的邮件那里去,谢谢了

liu980_980@163.com

验证码:   
评论内容: