INSERT语句中没有列列表的错误

时间:2018-03-23 15:13:22

标签: datetime ms-access jdbc ucanaccess

我正在尝试使用以下代码将日期值插入表格(MS Access 2016)以及其他值:

public boolean insertar_alumno (Alumno alumno) {

    SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
    String fecha = formato.format(alumno.getFechaNacimiento());
    System.out.println(fecha);

    String sql = "INSERT INTO Alumnos VALUES(?,?,?,?,?,?,?)";
    try {
        PreparedStatement ps = conn.getConnection().prepareStatement(sql);
        ps.setInt(1, alumno.getId());
        ps.setInt(2, alumno.getDNI());
        ps.setString(3, alumno.getNombre());
        ps.setDate(4, java.sql.Date.valueOf(fecha));
        ps.setString(5, alumno.getNivel());
        ps.setString(6, alumno.getCurso());
        ps.setString(7, alumno.getObservaciones());
        ps.executeUpdate();

        return true;

    } catch (SQLException ex) {
        System.out.println("Error en intersar_alumno.AlumnoDAO "+ex);
        return false;
    }
}

但我经常收到错误

  

net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc ::: 4.0.3数据异常:无效的日期时间格式

我甚至尝试将字符串值“2018-12-31”修复为

ps.setDate(4, "2018-12-31");

但它也不起作用。

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

尽管大多数(如果不是全部)SQL方言都支持没有列列表的INSERT语句,例如

INSERT INTO Company VALUES (?,?, ...)

一般认为这是不好的做法;列名应明确列出:

INSERT INTO Company (CompanyName, Address, ...) VALUES (?,?, ...)

这对于UCanAccess尤其重要,因为默认列顺序(;columnOrder=DATA)是列创建的顺序,这不一定是它们出现在中的顺序访问用户界面。

示例:我们创建一个名为[Company]的表:

Company1.png

当我们运行代码时

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM Company");
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
    System.out.println(rsmd.getColumnName(i));
}

我们得到了

CompanyID
CompanyName
Address
City

然后我们发现我们需要第二个“地址”行,所以我们将它添加到表格的中间。

Company2.png

当我们再次运行Java代码时,我们会看到

CompanyID
CompanyName
Address
City
Address2

请注意,列名与Access UI中显示的顺序不同。

要解决此问题,我们可以在UCanAccess连接网址中指定;columnOrder=DISPLAY