2015-06-14 79 views
0

我正在拉我的頭髮,我找不到好的解決方案,我搜索了一些其他主題,但仍然沒有任何想法。 PreparedStatement有問題,尤其是設置日期。我知道,在YYYY-MM-DD中,Date需要日期格式爲YYYY/MM/DD和java.sql.date,但是這些方案中的任何一個都不能正常工作。Oracle SQL PreparedStatement setdate

String query = "INSERT INTO STUDENTS VALUES (?,?,?,?,?,?,?,?)"; 
      PreparedStatement statement = connection.prepareStatement(query); 
      statement.setInt(1, Integer.parseInt(studentIndex.getText())); 
      statement.setString(2, studentName.getText()); 
      statement.setString(3, studentLastName.getText()); 
      statement.setDate(4, Date.valueOf(studentDate.getText())); 
      statement.setNString(5, studentSex.getText()); 
      statement.setString(6, studentCity.getText()); 
      statement.setString(7, studentMajor.getText()); 
      statement.setString(8, studentSpeciality.getText()); 
      ResultSet result = statement.executeQuery(); 

在JTextField中啓動並寫入一些示例日期後,例如, 1999-10-20 or 1999/10/20我有個例外

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException 
at java.sql.Date.valueOf(Date.java:143) 
at Project$7.actionPerformed(Project.java:166) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6525) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6290) 
at java.awt.Container.processEvent(Container.java:2234) 
at java.awt.Component.dispatchEventImpl(Component.java:4881) 
at java.awt.Container.dispatchEventImpl(Container.java:2292) 
at java.awt.Component.dispatchEvent(Component.java:4703) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) 
at java.awt.Container.dispatchEventImpl(Container.java:2278) 
at java.awt.Window.dispatchEventImpl(Window.java:2750) 
at java.awt.Component.dispatchEvent(Component.java:4703) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:702) 
at java.awt.EventQueue$3.run(EventQueue.java:696) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) 
at java.awt.EventQueue$4.run(EventQueue.java:724) 
at java.awt.EventQueue$4.run(EventQueue.java:722) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

有什麼建議嗎?

編輯: 解決

回答

0

嘗試使用TO_DATE與SQL語句明確設置的日期格式,例如:

String query = "INSERT INTO STUDENTS VALUES (?,?,?,TO_DATE(?,'YYYY-MM-DD'),?,?,?,?)"; 

然後確保Java變量中的日期格式匹配。如果不同,請根據需要更改TO_DATE中的格式。

+0

不幸的是不起作用。與YYYY/MM/DD相同。 – 1kka

+0

不要使用「statement.setDate(4,Date.valueOf(studentDate.getText()));」,使用「statement.setString(4,studentDate.getText());」。我們讓Oracle通過TO_DATE執行轉換,所以我們只傳入字符串。 – TenG

+0

解決了,謝謝 – 1kka

0

而不是嘗試使用Date.valueOf來解析日期字符串,您應該使用DateFormat.parse來代替。它允許你設置一個模式來精確地指定日期字符串的格式是什麼,以便正確解析。實際上,便利課可能就是您所需要的。請參閱文檔herehere