Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Blob, executeUpdate, NullPointerException


Автор: light0ff 26.3.2006, 18:49
Сомневаюсь, что мне кто-нибудь поможет, но все же.

Проблема необычная. Создается самый обычный запрос на обновление. Этот запрос без проблем выполняется в SQL клиенте, но в Джаве вылетает java.sql.SQLException: java.lang.NullPointerException при выполнении executeUpdate (исключение вылетает только в том случае, если используется Blob).

Так в чем же может быть дело? Выполняется в SQL клиенте, но не в Джавеsmile

Автор: powerOn 26.3.2006, 19:16
Выкладывай код.

Автор: light0ff 26.3.2006, 19:26
Вообще, это проект по програмной инженерии. Все, конечно, не выложить но...

Метод для вставки в таблицу:
Код

    public void defaultSqlInsert(Collection objects) {
        for (Iterator it = objects.iterator(); it.hasNext(); ) {
            PropertyBasedObject pbo = (PropertyBasedObject) it.next();
            pbo.put(ID, getIdByTable(pbo.getTableName()));
            String insert = "insert into " + pbo.getTableName() + "(";
            String insertAdd = " values(";
            Collection values = new Vector();
            String[] fields = pbo.getAllSqlFields();

            boolean isFirst = true;
            for (int i = 0; i < fields.length; i++) {
                if (pbo.containsKey(fields[i])) {
                    if (!isFirst) {
                        insert += ", ";
                        insertAdd += ", ";
                    }
                    else isFirst = false;
                    insert += fields[i];
                    insertAdd += "?";
                    values.add(pbo.get(fields[i]));
                }
            }
            insert += ")";
            insertAdd += ")";
            insert += insertAdd;

            try {
                PreparedStatement preparedStatement = p3isDB.prepareStatement(insert);
                for (int i = 1; i <= values.size(); i++) {
                    Object obj = ((Vector) values).get(i - 1);
                    if (obj.getClass().equals(String.class))
                        preparedStatement.setString(i, (String) obj);
                    else if (obj.getClass().equals(Long.class))
                        preparedStatement.setLong(i, ((Long) obj).longValue());
                    else if (obj.getClass().equals(Double.class))
                        preparedStatement.setDouble(i, ((Double) obj).doubleValue());
                    else if (obj.getClass().equals(Boolean.class))
                        preparedStatement.setBoolean(i, ((Boolean) obj).booleanValue());
                    else if (obj.getClass().equals(PImageBlob.class))
                        preparedStatement.setBlob(i, (Blob) obj);
                    else if (obj.getClass().equals(java.util.Date.class))
                        preparedStatement.setDate(i, new Date (((java.util.Date) obj).getTime()));
                }
                preparedStatement.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


Получившийся запрос:

insert into worker(id, first_name, surname, patronomic, sex, date_of_birth, personal_code, family_status_id, education_type_id, reg_date, foto) values(2, '1', '2', '3', 1, '2009-12-12', '123', 1, 1, '2006-03-26', 'здесь очень длинная строка')

Автор: Stampede 26.3.2006, 19:48
Цитата(light0ff @ 26.3.2006, 19:26 Найти цитируемый пост)
Получившийся запрос:

insert into worker(id, first_name, surname, patronomic, sex, date_of_birth, personal_code, family_status_id, education_type_id, reg_date, foto) values(2, '1', '2', '3', 1, '2009-12-12', '123', 1, 1, '2006-03-26', 'здесь очень длинная строка')


В принципе уже почти все ясно, но нужно еще немного инфы:
  • тип и версия СУБД
  • исползуемый JDBC драйвер
  • как объявлено поле foto

И это, ты точно говоришь, что прогоняешь в точности тот же запрос через SQL клиента, и он срабатывает? Если да, то что за клиент (жабный или нет).

Автор: LSD 26.3.2006, 21:30
Что за класс PImageBlob?

Автор: light0ff 28.3.2006, 16:55
1.
* тип и версия СУБД - Mysql 5
* исползуемый JDBC драйвер - mysql-connector-java-3.1.12-bin.jar
* как объявлено поле foto - foto LONGBLOB

2. PImageBlob - public class PImageBlob implements Blob

Автор: LSD 28.3.2006, 20:39
Цитата(light0ff @ 28.3.2006, 16:55 Найти цитируемый пост)
2. PImageBlob - public class PImageBlob implements Blob

В MySQL Connector я не нашел класса PImageBlob, ты его сам что-ли писал?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)