2010-03-21 23 views
0

我遇到了由Sybase IQ服務器引發的模糊的錯誤消息。綁定主機變量的長度超過MaxLength

com.sybase.jdbc2.jdbc.SybSQLException:ASA錯誤-1001019:不支持VARCHAR處理功能 綁定的長度超過255個長度主機變量 超過的MaxLength, - (df_Heap.cxx 2145) 在com.sybase.jdbc2.tds.Tds.processEed(Tds.java:2636) at com.sybase.jdbc2.tds.Tds.nextResult(Tds.java:1996) at 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.jd bc.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(); 
} 

任何幫助表示讚賞

回答

0

問號是綁定變量。您的stmt.set...(...)語句之一正試圖設置比數據庫列允許的值更長的值。嘗試顯示您正在設置的每個Java字符串的長度。

0

最後我能夠用客戶發送的樣本數據重現錯誤。

其中一個字段的數據類型是VarChar(4000)。但是用戶試圖用32k字符的數據更新這個字段!

一旦我截斷數據,數據已成功更新。

我想Sybase會自動截斷數據,但顯然它不。

相關問題