Ошибка формата даты java.sql.SQLException: неверный тип столбца - PullRequest
6 голосов
/ 03 марта 2012

Я отображаю дату в формате JSF, используя pattern="dd-MMM-yyyy".

Когда я пытаюсь вставить / обновить значения даты в моей оракулярной базе данных, я получаю

java.sql.SQLException: Invalid column type

потому что мой формат даты перед вставкой или обновлением находится в этом формате

Wed Feb 09 00:00:00 AST 2011

Как правильно вставить или обновить значения дат в Oracle Db и каков наилучший подход для этого?

Обновление 1

Мой код вставки в БД.

private void editSchedule(Schedule schedule)
        Object[] values = { schedule.getStartDate(),
                schedule.getVacationId() };             
        Connection connection = null;       
        PreparedStatement preparedStatement = null; 
        try {                           
            connection = datacon.getConnection();               
            preparedStatement = prepareStatement(connection, SQL_EDIT, values);         
            preparedStatement.executeUpdate();          

        } catch (Exception e) {
            logger.info("errro "+e.getMessage());
            e.printStackTrace();
        } finally {
            // TODO: handle exception
            close(connection, preparedStatement);
        }

    }

часть кода PreparedStaement

public static PreparedStatement prepareStatement
        (Connection connection, String sql, Object... values)
            throws SQLException
    {
        PreparedStatement preparedStatement = connection.prepareStatement(sql
            );
        setValues(preparedStatement, values);
        return preparedStatement;
    }

    public static void setValues(PreparedStatement preparedStatement, Object... values)
        throws SQLException
    {
        for (int i = 0; i < values.length; i++) {
            preparedStatement.setObject(i + 1, values[i]);
            logger.info("sql  "+Arrays.asList(values));
        }
    }

Ответы [ 3 ]

6 голосов
/ 03 марта 2012

JDBC понимает только java.sql.Date, java.sql.Time и java.sql.Timestamp как типы столбцов SQL, но не java.util.Date.

Вам нужно изменить

    Object[] values = { schedule.getStartDate(),
            schedule.getVacationId() };             

от

    Object[] values = { new java.sql.Date(schedule.getStartDate().getTime()),
            schedule.getVacationId() };             

Тогда это сработает. Просто продолжайте использовать java.util.Date в вашей модели. JSF, в свою очередь, не понимает java.sql.Date.

5 голосов
/ 03 марта 2012

Звучит так, будто вы пытаетесь включить данные как текст при вставке / обновлении.Не делайте этого - используйте java.sql.Date в PreparedStatement.Представлять ненужные преобразования строк - это действительно плохая идея - это делает ваш код очень хрупким и делает код более запутанным: сохраняйте ваши данные в соответствующем типе данных как можно дольше.

2 голосов
/ 03 марта 2012
public static String dateToSQLFormat(Date date){
        Format formatter = new SimpleDateFormat("yyyy-MM-dd");
        String ret=formatter.format(date);
        return ret;
    }
...