很简单的例子 MSSQL varchar 类型 长度50
select name from student插入到ora中 varchar2类型 长度 20
 报异常说 值大 进行查看 
rsMS.getString(18).getBytes().length 有超过20的于是
if (null == rsMS.getString(18)) 
{
preORA.setNull(18, java.sql.Types.VARCHAR);
} else {
    if(rsMS.getString(18).getBytes().length>20||rsMS.getString(18).length()>20)
      { preORA.setString(18, rsMS.getString(18).getBytes().toString().substring(0, 20));}
   else
       {preORA.setString(18, rsMS.getString(18));}
}Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 20 
报这个异常,如何解决能顺利插入

解决方案 »

  1.   

    是 mssql  name啊 存的就是中文 还有括号跟斜线
      

  2.   

    java逻辑问题:
    String t18 = rsMS.getString(18);
    if (null == t18)
    {
    preORA.setNull(18, java.sql.Types.VARCHAR);
    } else {
        if(rsMS.getString(18).length()>20) //如果子串大于20,则先按字符取20
    {
    t18 = t18.substring(0,20);
    if (t18.getBytes().toString()>20) //如果按字节还大于20,
      { preORA.setString(18, rsMS.getString(18).getBytes().toString().substring(0, 20));
      }
      else
      {preORA.setString(18, t18);
      }
        }
    }
      

  3.   

    nono,我上面的程序,下面所有的rsMS.getString(18)均改为t18。
      

  4.   

    以此为准,但是最后那个字如果是汉字,有可能只截取到一半,在java中在做下判断。
    String t18 = rsMS.getString(18);
    if (null == t18)
    {
    preORA.setNull(18, java.sql.Types.VARCHAR);
    } else {
    if(t18.length()>20) //如果子串大于20,则先按字符取20
    {
    t18 = t18.substring(0,20);
    }
    if (t18.getBytes().toString()>20) //如果按字节还大于20,
      { preORA.setString(18, t18.getBytes().toString().substring(0, 20));
      }
      else
      {preORA.setString(18, t18);
      }
    }
      

  5.   

    if (null == rsMS.getString(18) || "".equals(rsMS.getString(18).trim())) {
    preORA.setNull(18, java.sql.Types.VARCHAR);
    } else {
    if (rsMS.getString(18).length() > 20) {
         String t18 = rsMS.getString(18).substring(0, 20);
       if (t18.getBytes().length > 20) {
    preORA.setString(18, rsMS.getString(18).getBytes()
    .toString().substring(0,20));
    } else {
    preORA.setString(18, t18);
    }
         }
    }
    Exception in thread "main" java.sql.SQLException: 索引中丢失  IN 或 OUT 参数:: 18
    开始报这个异常
      

  6.   


    试试5楼的,我下面的已经用t18代替所有rsMS.getString(18)
      

  7.   

    我的意思其实是这样:
    1。定义个变量,取得rsMS.getString(18)的值。
    2。如果为空,set对应字段空
    3。如果不为空,看变量总长度大于20(不分中英文),即先取变量的substring(0,20)
    4。此时变量字符长度应该<=20,再看字节是否>20,大于则取前20位。不大于则直接set。上面说了最后一个字是汉字,还需要判断,因为可能只取了最后那个字的一半。楼主这个问题其实适合去java版
      

  8.   

    解决了
    把截取的字节20 改为10  然后在逻辑上少了个else