0

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

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

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

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)
4

1 回答 1

0

好吧,0151-06-25 不是无效日期,因此通过 joda-time 和 SimpleDateFormat 和 javax.xml.bind.DatatypeConverter.parseDateTime 运行它不会死。但是,在调用引发异常的更新语句之前,您可以检查特定于您的用例(和 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。

于 2013-10-13T22:38:03.983 回答