将截断字符串或二进制数据是个很常见的问题,可是我这里遇到的是个让人琢磨不明白的问题首先看看报错的代码
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:320)
at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:45)
at $Proxy1.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:22)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:51)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:29)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:65)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:39)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:93)
... 7 more是用ibatis3做持久层的。
JDBC的driver使用的sqljdbc4.jarSQLServer有两台一样的库
以SQLA, SQLB带称
版本均为
Microsoft SQL Server 2005 - 9.00.4035.00 (X64) 
Nov 24 2008 16:17:31 
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)客户端的程序在两个相同的linux进行运行
Linux平台
uname -a
Linux localhost.localdomain 2.6.18-92.el5 #1 SMP Tue Jun 10 18:51:06 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
现在用LinuxA,LinuxB代称一条很普通的insert语句,出现以上问题而且更怪异的是。LinuxA,分别在SQLA,SQLB都可以成功,不出错,但是LinuxB不行,Linux同样的java代码,在SQLA上可以成功,但是在SQLB上出上面的错。
希望高人帮助解答。如果分不够,在开新贴给分。

解决方案 »

  1.   

    谢谢,这么快回复也这样试过,检查所有数据,没有超过范围的。而且注意后面的现象,同样的代码,同样的数据库,为何LinuxA都可以成功,而LinuxB仅在其中一台SQLServer中遭遇错误。
      

  2.   

    查找出错的sql语句,找出本条语句中所有字段对应的值,与数据库字段长度对照
      

  3.   


    谢谢,可以简单的讲一下步骤么,实在是比较着急,对sqlserver又不了解。
      

  4.   

    一条很普通的insert语句,出现以上问题 
    检查字段类型和长度吧,主要是你的值
      

  5.   

    sql是用的绑定变量的方式执行的。把出错的数据,转换成sql的方式,在sqlbrowser里执行是OK的,而且上面的错误仅仅出现在LInuxB 到 SQLB上出错,而LinuxB 到 SQLA执行同样的代码,没有问题。而且和LinuxB一样的机器LinuxA上执行同样的代码,到SQLA和SQLB,都可以成功。
      

  6.   

    已经解决了,原来是有个insert的trigger,这个trigger有一定的逻辑,需要记录hostname而出问题的那个Linux的hostname很长,而其中SQLA上没有trigger,SQLB上入库才只在LinuxB上出问题。感觉SQL Server也比较好玩,不过管理和性能方面和Oracle还是有点差异的。来者都有分,谢谢大家的回答了
      

  7.   

    不明白已经解决了,原来是有个insert的trigger,这个trigger有一定的逻辑,需要记录hostname而出问题的那个Linux的hostname很长,而其中SQLA上没有trigger,SQLB上入库才只在LinuxB上出问题。是怎么回事!?