日期格式错误 java.sql.SQLException: 无效的列类型

7
我将使用pattern="dd-MMM-yyyy"在JSF中显示日期。但是,当我尝试向我的Oracle数据库插入/更新日期值时,我遇到了问题。
java.sql.SQLException: Invalid column type

因为在插入或更新之前,我的日期格式是这样的

Wed Feb 09 00:00:00 AST 2011

我该如何正确地向Oracle数据库插入或更新日期值,哪种方法是最好的?
更新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个回答

7

JDBC只能理解java.sql.Datejava.sql.Timejava.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

1
感谢BalusC的回答,虽然很简短,但我已经为此苦苦挣扎了一段时间。 :-) - Jacob
如果您有一个java.util.Date,您可以使用以下方式简单地进行转换:new java.sql.Date(myJavaUtilDate.getTime())。 - Jaco Van Niekerk

5
看起来你在插入/更新时尝试将数据作为文本包含。不要这样做 - 在 PreparedStatement 中使用 java.sql.Date 。引入不必要的字符串转换是一个非常糟糕的想法 - 它使您的代码非常脆弱,并使代码更加混乱:尽可能长时间地将数据保留在适当的数据类型中。

1
@Polappan:为什么总是使用setObject而不是使用setDate显式设置参数?我至少会尝试一下。 - Jon Skeet
@Polappan: “parent” 是什么意思?而 schedule.getStartDate() 的确切类型是什么?例如,如果它是一个 java.util.Date 类型,则可能需要创建一个 java.sql.Date。 - Jon Skeet
我是说 setObject 可以接受所有对象,无论日期或字符串!schedule.getStartDate()java.util.Date 类型的。 - Jacob
@Polappan:是的,它可以 - 我也希望它能够工作,但至少出于实验目的,我会尝试使用 setDate。正如我所说,您可能还想尝试创建一个 java.sql.Date 值,将 java.util.Date 包装起来。 - Jon Skeet
@Polappan:我只是建议在 SQL 部分使用 java.sql.Date - 在其余部分可以使用 java.util.Date,但在插入时创建一个 java.sql.Date 的副本。 - Jon Skeet
显示剩余6条评论

2
public static String dateToSQLFormat(Date date){
        Format formatter = new SimpleDateFormat("yyyy-MM-dd");
        String ret=formatter.format(date);
        return ret;
    }

为什么要引入不必要的字符串转换呢?在JDBC中,有更好的传递强类型数据的方式。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接