2013-10-13 57 views
0

我正在開發一個Java程序,用於將Microsoft Access 2010數據庫從一個模式轉移到另一個模式。我注意到大約3%的記錄包含無效的日期,這些日期引發了DateTime字段溢出異常。防止日期時間字段溢出異常

如何編寫日期值的測試,以將任何無效日期轉換爲null,然後才能觸發DateTime字段溢出異常?

這裏是觸發異常的代碼行的一個示例:

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

那麼,是0151-06-25不是一個in有效的日期,所以通過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。