我正在开发一个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)
答案 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。