我正在尝试使用以下代码将日期值插入表格(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");
但它也不起作用。
可能是什么问题?
答案 0 :(得分:0)
尽管大多数(如果不是全部)SQL方言都支持没有列列表的INSERT语句,例如
INSERT INTO Company VALUES (?,?, ...)
一般认为这是不好的做法;列名应明确列出:
INSERT INTO Company (CompanyName, Address, ...) VALUES (?,?, ...)
这对于UCanAccess尤其重要,因为默认列顺序(;columnOrder=DATA
)是列创建的顺序,这不一定是它们出现在中的顺序访问用户界面。
示例:我们创建一个名为[Company]的表:
当我们运行代码时
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
然后我们发现我们需要第二个“地址”行,所以我们将它添加到表格的中间。
当我们再次运行Java代码时,我们会看到
CompanyID
CompanyName
Address
City
Address2
请注意,列名与Access UI中显示的顺序不同。
要解决此问题,我们可以在UCanAccess连接网址中指定;columnOrder=DISPLAY
。