绑定主机变量的长度超过MaxLength

时间:2010-03-21 09:42:23

标签: java sql sybase-iq

我遇到了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();
}

感谢任何帮助

2 个答案:

答案 0 :(得分:0)

问号是绑定变量。您的stmt.set...(...)语句之一正在尝试设置比数据库列允许的值更长的值。尝试显示您正在设置的每个Java字符串的长度。

答案 1 :(得分:0)

最后,我能够使用客户发送的样本数据重现错误。

其中一个字段的数据类型是VarChar(4000)。但是,用户试图使用具有32k字符的数据更新此字段!

截断数据后,数据已成功更新。

我认为Sybase会自动截断数据,但显然它没有。