【问题标题】:Date Format Error java.sql.SQLException: Invalid column type日期格式错误 java.sql.SQLException:无效的列类型
【发布时间】:2012-03-21 15:59:56
【问题描述】:

我在 JSF 中使用 pattern="dd-MMM-yyyy" 显示日期。

当我尝试在我的 oracle 数据库中插入/更新日期值时,我得到了

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));
        }
    }

【问题讨论】:

    标签: java jdbc jsf-2 primefaces


    【解决方案1】:
    public static String dateToSQLFormat(Date date){
            Format formatter = new SimpleDateFormat("yyyy-MM-dd");
            String ret=formatter.format(date);
            return ret;
        }
    

    【讨论】:

    • 为什么要引入不必要的字符串转换?在 JDBC 中传递强类型数据有很多更好的方法。
    【解决方案2】:

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

    【讨论】:

    • 我不想将数据包含或转换为文本。在我的代码中 startDate 被声明为 Date 而不是 String。但是当我尝试插入数据库时​​,格式与DD-MMM-YYYY 的格式不同。我不确定我的日期格式是如何更改为 Wed Feb 09 00:00:00 AST 2011 在我的 bean 中我有 for (Schedule editValues : beanValues) { editValues.setStartDate(selectedRow.getStartDate()); 对于数据库更新代码我有错误来自这一行 preparedStatement = prepareStatement(connection, SQL_EDIT, values); 其中值被声明为 Object[] values
    • @Polappan:“格式不同”是什么意思?在数据库中,它应该只是一个 DATETIME。它在逻辑上没有 格式。听起来您的 SQL 可能不正确...请发布更多代码。
    • @Polappan:为什么总是使用setObject 而不是使用setDate 显式设置参数?我至少会尝试那个。
    • 感谢您的回复。但我有一个问题 setObject 是 setDate 的父级正确吗?
    • @Polappan:“父母”是什么意思? schedule.getStartDate() 是什么确切类型?例如,如果它是 java.util.Date,您可能想要创建一个 java.sql.Date。
    【解决方案3】:

    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。

    【讨论】:

    • 感谢 BalusC 的回答,尽管我在过去一段时间里一直在为此苦苦挣扎。 :-)
    • 如果你有一个 javaq.util.Date,你可以简单地使用: new java.sql.Date(myJavaUtilDate.getTime())
    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多