防止datetime字段溢出异常

时间:2013-10-13 22:08:02

标签: java jdbc

我正在开发一个java程序,用于将Microsoft Access 2010数据库从一个模式转移到另一个模式。我注意到大约3%的记录包含无效日期,这些日期会抛出DateTime字段溢出异常。

在能够触发DateTime字段溢出异常之前,如何为将任何无效日期转换为null的Date值编写测试?

以下是触发异常的一行代码示例:

try {ps6.setDate(4, myDate);} catch (SQLException e) {e.printStackTrace();}

以下是抛出异常的myDate变量的无效值的示例:

0151-06-25

这是错误的堆栈跟踪:

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Datetime field overflow
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6964)
    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7121)
    at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3156)
    at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:215)
    at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(JdbcOdbcPreparedStatement.java:137)
    at pic_data.test.MigrateDataTools.migratePICIntakeTable(MigrateDataTools.java:1007)
    at pic_data.test.MigrateDataTools.main(MigrateDataTools.java:17)

1 个答案:

答案 0 :(得分:0)

好吧,是0151-06-25不是无效日期,所以通过joda-time和SimpleDateFormat以及javax.xml.bind.DatatypeConverter.parseDateTime运行它不会死。 但是,在调用抛出异常的update语句之前,您可以检查特定于您的用例(和JDBC驱动程序)的边界条件(例如真正的旧年)。

Calendar c7= javax.xml.bind.DatatypeConverter.parseDateTime("0151-06-25");
Date d4 = c7.getTime();
int year = c7.get( Calendar.YEAR);
System.out.println("d4: " + d4 + "; year: " + year);

如果年份或任何其他组件看起来不好,则在将日期设置为预准备语句之前将其设置为NULL。