0

我遇到了 Sybase IQ 服务器抛出的神秘错误消息。

com.sybase.jdbc2.jdbc.SybSQLException:ASA 错误 -1001019:在 varchars 上不受支持的函数超过 255 绑定主机变量的长度超过 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) 在 com.sybase.jdbc2.jdbc.SybPreparedStatement.executeUpdate(SybPreparedStatement.java:91) 在 ibs.dao.CM3RM1DAO。updateToTable(CM3RM1DAO.java:197) 在 ibs.dao.CM3RM1DAO.isXMLProcessed(CM3RM1DAO.java:88) 在 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();
}

任何帮助表示赞赏

4

2 回答 2

0

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

其中一个字段的数据类型是 VarChar(4000)。然而,用户试图用包含 32k 个字符的数据来更新这个字段!

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

我以为 Sybase 会自动截断数据,但显然它不会。

于 2010-03-27T09:39:06.313 回答
0

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

于 2010-03-24T17:37:11.287 回答