2016-01-25 51 views
0

我想补充从JXDatePicker日期值插入我的SQL数据库,运行它时,但是我得到这个错误:从JXDatePicker添加日期插入SQL数据库在Netbeans的

java.sql.sqldataexception:语法日期时间值的字符串表示是不正确

这是我的代码:

try { 
    String url = "jdbc:derby://localhost:1527/Members"; 
    String username = "admin1"; 
    String password = "admin1"; 

    Connection con = DriverManager.getConnection(url, username, password); 
    Statement stmt = con.createStatement(); 

    String query = "INSERT INTO BOOKING(MEMBERID, NAME, CONTACT, " 
      + "EMAILADDRESS, RESERVATIONDATE, RESERVATIONTIME) " 
      + "VALUES('"+txtMemberID.getText()+"', '"+txtName.getText()+"', " 
      + "'"+txtContact.getText()+"', '"+txtEmail.getText()+"', " 
      + "'"+comboDate.getDate()+"', '"+comboTime.getSelectedItem()+"')"; 

    stmt.execute(query); 

    JOptionPane.showMessageDialog(null, "Booking created"); 

    txtMemberID.setText(null); 
    txtName.setText(null); 
    txtContact.setText(null); 
    txtEmail.setText(null); 
    comboDate.setDate(null); 
    comboTime.setSelectedItem("00"); 

    } 
    catch(SQLException ex) { 
     JOptionPane.showMessageDialog(null, ex.toString()); 
    } 

在我的数据库中的日期属性指定的数据类型是日期。

谢谢。

+0

你能分担'BOOKING'表说明(包括数据类型的列,您需要使用' PreparedStatement'用于执行'INSERT'。 –

+0

'CREATE TABLE “ADMIN1” .BOOKING ( \t MEMBERID VARCHAR(6)不为空主键, \t NAME LONG VARCHAR不为空, \t CONTACT VARCHAR(9)不为空, \t EMAILADDRESS LON摹VARCHAR NOT NULL, \t RESERVATIONDATE日期不为空, \t RESERVATIONTIME VARCHAR(6)不为空 )' 请问怎么了'PreparedStatement'工作?我尝试过在网上搜索时发现的各种代码,但总是出现错误。 – xxpfb

回答

0

您的问题是,您正在尝试将Date值(或String的一个表示)嵌入到INSERT语句中。您应该使用参数化的SQLPreparedStatement,而不是将变量串联到查询文字中。除了从SQL injection保护代码外,参数化语句可以被数据库重用,这意味着DB在每次执行之前不需要解析SQL - 如果您运行大量的循环查询。

你应该照顾的另一件事是关闭你打开的资源。在您的示例代码中,ConnectionStatement在不再需要时保持打开状态。使用在Java 7中引入的try-with-resources statement可以很容易地解决该问题。在执行语句后,在try子句中声明的资源会自动关闭。

全部放在一起,这里是一个什么样的修改后的代码看起来是这样一个例子:

String query = "INSERT INTO BOOKING(MEMBERID, NAME, CONTACT, " 
     + "EMAILADDRESS, RESERVATIONDATE, RESERVATIONTIME) " 
     + "VALUES(?, ?, ?, ?, ?, ?)"; 

try (Connection con = DriverManager.getConnection(url, username, password); 
    PreparedStatement ps = con.prepareStatement(query)) { 

    ps.setString(1, txtMemberID.getText()); 
    ps.setString(2, txtName.getText()); 
    ps.setString(3, txtContact.getText()); 
    ps.setString(4, txtEmail.getText()); 
    ps.setDate(5, new java.sql.Date(comboDate.getDate().getTime())); 
    ps.setString(6, comboTime.getSelectedItem().toString()); 

    ps.executeUpdate(); 

    JOptionPane.showMessageDialog(null, "Booking created"); 

    /*clear the UI components etc.*/ 

} catch(SQLException ex) { 
    JOptionPane.showMessageDialog(null, ex.toString(), JOptionPane.ERROR_MESSAGE); 
} 
+0

非常感谢!然而,我仍然面临着我的日期这个错误:java.util.Date不能转换为java.sql.Date。有没有办法正确地转换它,代码应该放在哪里? – xxpfb

+0

对不起,我的不好;我编辑了答案来修复日期处理。 –

+0

啊我明白了。谢谢soooo多!这真的很有帮助! :) – xxpfb