日期:2014-05-18  浏览次数:20442 次

很怪异的 “将截断字符串或二进制数据” 问题
将截断字符串或二进制数据是个很常见的问题,可是我这里遇到的是个让人琢磨不明白的问题

首先看看报错的代码
### 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.jar

SQLServer有两台一样的库
以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上出上面的错。


希望高人帮助解答。

如果分不够,在开新贴给分。

------解决方案--------------------
设置的字段的长度小了。
------解决方案--------------------
查找出错的sql语句,找出本条语句中所有字段对应的值,与数据库字段长度对照
------解决方案--------------------
用事件探查器跟踪下错误信息
------解决方案--------------------
一条很普通的insert语句,出现以上问题 


检查字段类型和长度吧,主要是你的值
------解决方案--------------------
探讨
引用:
用事件探查器跟踪下错误信息


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

------解决方案--------------------
把字段长度放长