Длина переменной хоста Bind превышает MaxLength - PullRequest
0 голосов
/ 21 марта 2010

Я обнаружил загадочное сообщение об ошибке, выданное сервером Sybase IQ.

com.sybase.jdbc2.jdbc.SybSQLException: ошибка ASA -1001019: функция не поддерживается в varchars длиннее 255 переменной хоста Length of 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) at com.sybase.jdbc2.jdbc.SybStatement.updateLoop (SybStatement.java:1642) at com.sybase.jdbc2.jdbc.SybStatement.executeUpdate (SybStatement.java:1625) at 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();
}

Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 27 марта 2010

Наконец я смог воспроизвести ошибку с примерами данных, отправленных клиентом.

Тип данных одного из полей - VarChar (4000).Однако пользователь пытался обновить это поле данными, которые имеют 32 000 символов!

После того, как я обрезал данные, данные были успешно обновлены.

Я думал, что Sybase автоматически обрезает данные, но, по-видимому,это не так.

0 голосов
/ 24 марта 2010

Знаки вопроса являются переменными связывания.Один из ваших операторов stmt.set...(...) пытается установить значение дольше, чем позволяет столбец базы данных.Попробуйте отобразить длину каждой настраиваемой строки Java.

...