在Java中插入日期以访问数据库 - 奇怪的问题

时间:2012-01-17 16:14:10

标签: java date insert

我正在尝试更新我的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从数据库中检索日期时,一切顺利。 只有在更新/插入时才会出现此问题。

3 个答案:

答案 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理解的格式,而无需格式化值。