我正在尝试更新我的AccessDB中的表,我遇到了一个奇怪的问题。 更新执行时不会抛出任何异常,但日期值是错误的 每当我更新记录时,值总是变为“30/12/1899”。 当我试图插入新记录时,同样的事情就会产生。
在我的数据库中,日期字段为ShortDate格式。
以下是我的代码示例:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
if (jList1.isSelectionEmpty()) {
JOptionPane.showMessageDialog(null, "You have not selected any computer!");
} else {
try {
String sql = "Update SYSTEMS set "
+ " CPU='" + cpuTextField.getText().trim()
+ "', MOBO='" + moboTextField.getText().trim()
+ "', RAM='" + ramTextField.getText().trim()
+ "', GPU='" + gpuTextField.getText().trim()
+ "', HDD='" + hddTextField.getText().trim()
+ "', PSU='" + psuTextField.getText().trim()
+ "', MONITOR='" + monitorTextField.getText().trim()
+ "', KEYBOARD='" + keyboardTextField.getText().trim()
+ "', MOUSE='" + mouseTextField.getText().trim()
+ "', OS='" + osTextField.getText().trim()
+ "', SOFTWARE='" + othersTextArea.getText().trim()
+ "', PURCHASE_DATE=" + df.format(jDateChooser1.getDate())
+ " where SYSTEM_ID='" + jList1.getSelectedValue().toString() + "'";
st = con.prepareStatement(sql);
st.executeUpdate();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
JOptionPane.showMessageDialog(null, "Updated");
}
}
为了弄清楚出了什么问题,我做了一个按钮,当我按下时 显示df.format(jDateChooser1.getDate())和的结果的消息 它显示了正确的日期。
private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
JOptionPane.showMessageDialog(null, df.format(jDateChooser1.getDate()));
}
我正在使用此组件来获取日期:JCalendar如果这有任何区别。 我不介意用普通的TextField替换它,只要正确导入日期即可。 当使用select从数据库中检索日期时,一切顺利。 只有在更新/插入时才会出现此问题。
答案 0 :(得分:2)
问题可能与SQL查询的格式有关;使用PreparedStatement
而不是手动格式化。这样做还可以降低与验证用户输入相关的错误的可能性,包括SQL injection等安全问题。例如:
String sql = "Update SYSTEMS set "
+ " CPU=?, MOBO=?, RAM=?"
+ //...
+ ", PURCHASE_DATE=?"
+ " where SYSTEM_ID=?";
PreparedStatement stmt = con.prepareStatement(sql);
int nextField = 1;
stmt.setString(nextField++, cpuTextField.getText().trim());
stmt.setString(nextField++, moboTextField.getText().trim());
stmt.setString(nextField++, ramTextField.getText().trim());
// ...
stmt.setDate(nextField++, jDateChooser1.getDate());
stmt.setString(nextField++, jList1.getSelectedValue().toString());
stmt.executeUpdate();
[编辑] 请注意,PreparedStatement#setDate()
方法需要java.sql.Date
,因此您可能需要将日期选择器返回的日期类型转换为其中之一,例如:
stmt.setDate(nextField++,
new java.sql.Date(jDateChooser1.getDate().getTime()));
答案 1 :(得分:0)
看起来您的日期格式与Access期望的格式不同。 要摆脱它,请使用名称参数 - 如http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html#supply_values_ps,而不是自己连接SQL。
答案 2 :(得分:0)
访问需要以#MM / dd / yyyy#格式指定的日期(包括哈希标记)。因此,如果在日期字符串的开头和结尾添加#分隔符,它应该可以工作。正如maerics建议的那样,最好使用PreparedStatement,因为JDBC驱动器将处理将Java Date转换为Access理解的格式,而无需格式化值。