Сбой подготовленного оператора с ошибкой DB2 SQL: SQLCODE: -401, SQLSTATE: 42818 - PullRequest
1 голос
/ 16 февраля 2012

Я работаю над приложением, которое обновляет данные в базе данных (IBM DB2 v 9.7) через JDBC.Вот схема таблицы:

Имя столбца Тип данных Длина

1) INDEX BIGINT -

2) USER_NAME VARCHAR 30

3) SRC VARCHAR 30

4) STARUS VARCHAR 150

5) RT_COUNT BIGINT -

И мой код выглядит так:

                                      String cmd1="Update ANALYTICS  SET RT_COUNT = 1 WHERE USER_NAME = ? AND STATUS = ?";
                                     PreparedStatement process=connection.prepareStatement(cmd1);

                 process.setString(1, Source);
                 process.setString(2, Content);


                 if(process.executeUpdate()==0)
                 {....

Но это не помогает, кто-нибудь может мне помочь?

Спасибо и всего наилучшего

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

В дополнение к ответу @Chris Aldrich на приведение в Java, если вы знаете, какими должны быть типы параметров, вы также можете привести их в SQL, например:

UPDATE ANALYTICS
   SET RT_COUNT  = CAST(? AS BIGINT)
 WHERE USER_NAME = CAST(? AS VARCHAR(30))
   AND STATUS    = CAST(? AS VARCHAR(150))
2 голосов
/ 16 февраля 2012

По данным сайта IBM, SQLSTATE 42818 - это 42818 «Операнды оператора или функции несовместимы или несопоставимы». Это означает, что вы указали неверный тип данных для вашего подготовленного оператора.

Возможно, вам понадобится вывести RT_COUNT и выполнить setInt или setLong или что-то еще, чтобы заставить его работать.

Кроме того, я предполагаю, что источник и контент являются строками? Если это не так, это также может способствовать этому.

Редактировать Для выполнения RT_COUNT, о котором я говорил, вам нужно изменить ваш запрос, сделав следующее:

String cmd1="Update ANALYTICS SET RT_COUNT = ? WHERE USER_NAME = ? AND STATUS = ?";
PreparedStatement process = connection.prepareStatement(cmd1);

process.setLong(1, new Long(1));
process.setString(2, source);
process.setString(3, content);

if(process.executeUpdate()==0)
{....

И это может быть вашей проблемой, потому что я не уверен, как драйвер интерпретирует «1». Это должно быть Long для отображения на bigint в DB2. Смотрите для , какие типы данных в Java соответствуют каким типам данных в DB2 .

...