【问题标题】:Insert Date in Java to Access DB - Weird issue在 Java 中插入日期以访问数据库 - 奇怪的问题
【发布时间】:2012-01-17 16:14:09
【问题描述】:

我正在尝试更新我的 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 如果这有什么不同的话。 只要正确导入日期,我不介意用纯文本字段替换它。 当使用 select 从数据库中检索日期时,一切顺利。 该问题仅在更新/插入时发生。

【问题讨论】:

    标签: java date insert


    【解决方案1】:

    问题可能与 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()));
    

    【讨论】:

    • 我不知道该怎么做。你能给我一个例子或一个阅读链接吗?
    • 谢谢,我会试一试,我会回复的。
    • 我收到一个错误:找不到合适的方法 setDate(int,java.util.Date) stmt.setDate(nextField++, jDateChooser1.getDate());
    • @sijoune:仔细检查setDate() 方法所需的类型以及日期选择器getDate() 方法返回的类型。最终,我想这取决于您使用的 JDBC 驱动程序;查看其文档中有关日期的内容。
    • 方法 PreparedStatement.setDate(int,java.sql.Date,Calendar) 不适用(实际和形式参数列表的长度不同)方法 PreparedStatement.setDate(int,java.sql.Date) 是不适用(实际参数 java.util.Date 无法通过方法调用转换转换为 java.sql.Date)。我应该改用 java.sql.Date 吗?我之前尝试过,但我得到了不同的日期。
    【解决方案2】:

    Access 需要以#MM/dd/yyyy# 格式指定日期(包括井号)。因此,如果您在日期字符串的开头和结尾添加 # 分隔符,它应该可以工作。正如 maerics 建议的那样,最好使用 PreparedStatement,因为 JDBC 驱动器将处理将 Java 日期转换为 Access 理解的格式,而无需格式化值。

    【讨论】:

      【解决方案3】:

      您的日期格式似乎与 Access 期望的不同。 要摆脱它,请使用名称参数 - 如http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html#supply_values_ps,而不是自行连接 SQL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 1970-01-01
        • 2014-06-06
        相关资源
        最近更新 更多