我想将JXDatePicker中的日期值添加到我的SQL数据库中,但运行时我遇到此错误:
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());
}
为我的数据库中的Date属性指定的数据类型是Date。
谢谢。
答案 0 :(得分:0)
您的问题是,您尝试将Date
值(或String
表示形式)嵌入INSERT
语句中。您应该通过PreparedStatement
使用参数化SQL ,而不是将变量连接到查询文字中。除了保护代码免受SQL injection的影响外,参数化语句还可以被数据库重用,这意味着DB在每次执行之前都不需要解析SQL - 如果你这样做,这一点尤其重要# 39;在循环中重新运行大量查询。
您应该关注的另一件事是关闭您已打开的资源。在您的示例代码中,Connection
和Statement
在不再需要后保持打开状态。这很容易使用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);
}