我遇到了Sybase IQ服务器抛出的神秘错误消息。
com.sybase.jdbc2.jdbc.SybSQLException:ASA错误-1001019:功能 长度超过255的varchars不支持Bind主机变量的长度 超过MaxLength, - (df_Heap.cxx 2145) 在com.sybase.jdbc2.tds.Tds.processEed(Tds.java:2636) 在com.sybase.jdbc2.tds.Tds.nextResult(Tds.java:1996) 在com.sybase.jdbc2.jdbc.ResultGetter.nextResult(ResultGetter.java:69) 在com.sybase.jdbc2.jdbc.SybStatement.nextResult(SybStatement.java:204) 在com.sybase.jdbc2.jdbc.SybStatement.nextResult(SybStatement.java:187) 在com.sybase.jdbc2.jdbc.SybStatement.updateLoop(SybStatement.java:1642) 在com.sybase.jdbc2.jdbc.SybStatement.executeUpdate(SybStatement.java:1625) at com.sybase.jdbc2.jdbc.SybPreparedStatement.executeUpdate(SybPreparedStatement.java:91) at ibs.dao.CM3RM1DAO.updateToTable(CM3RM1DAO.java:197) at ibs.dao.CM3RM1DAO.isXMLProcessed(CM3RM1DAO.java:88) at ibs.xml.parser.XMLParser.parsingXMLIntoBO(XMLParser.java:2125) 在ibs.common.util.MainClass.main(MainClass.java:74)
我们有几列(DESCRIPTION
等),类型为varchar(4000)
。但是我可以直接更新它们而不会有任何错误。并且,我没有看到任何指定任何绑定变量的代码,因此我不知道消息来自何处。
这是代码(我稍微修改了一下):
String sql = "UPDATE TABLEX SET " +
"COMPANY = ?, CUSTOMER_REFERENCE= ?, " +
"STATUS = ?, CONTACT_FIRST_NAME = ?, CONTACT_LAST_NAME = ?, " +
"SEVERITY = ?, PRIORITY_CODE = ?, REQUESTEDDATE = ?, " +
"CLOSE_TIME = ?, LEAD_TIME = ?, CHANGE_REASON = ?, MODTIME = ? WHERE NUMBER = ?";
stmt = conn.prepareStatement(sql);
for loop here
{
stmt.setString(...);
.
.
stmt.executeUpdate();
}
感谢任何帮助
答案 0 :(得分:0)
问号是绑定变量。您的stmt.set...(...)
语句之一正在尝试设置比数据库列允许的值更长的值。尝试显示您正在设置的每个Java字符串的长度。
答案 1 :(得分:0)
最后,我能够使用客户发送的样本数据重现错误。
其中一个字段的数据类型是VarChar(4000)。但是,用户试图使用具有32k字符的数据更新此字段!
截断数据后,数据已成功更新。
我认为Sybase会自动截断数据,但显然它没有。