0

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) で、com.sybase.jdbc2.jdbc.SybPreparedStatement.executeUpdate(SybPreparedStatement.java:91) で、ibs.dao.CM3RM1DAO で。updateToTable(CM3RM1DAO.java:197) at ibs.dao.CM3RM1DAO.isXMLProcessed(CM3RM1DAO.java:88) at ibs.xml.parser.XMLParser.parsingXMLIntoBO(XMLParser.java:2125) at 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

やっとお客様から送っていただいたサンプルデータでエラーを再現できました。

フィールドの 1 つのデータ型が VarChar(4000) でした。しかし、ユーザーはこのフィールドを 32k 文字のデータで更新しようとしていました!

データを切り捨てると、データは正常に更新されました。

Sybase は自動的にデータを切り捨てると思っていましたが、そうではないようです。

于 2010-03-27T09:39:06.313 に答える
0

疑問符はバインド変数です。ステートメントの 1 つがstmt.set...(...)、データベース列が許容するよりも長い値を設定しようとしています。設定している各 Java String の長さを表示してみてください。

于 2010-03-24T17:37:11.287 に答える