没有列列表的 INSERT 语句的错误
Posted
技术标签:
【中文标题】没有列列表的 INSERT 语句的错误【英文标题】:Errors from INSERT statement without a column list 【发布时间】:2018-03-23 15:13:21 【问题描述】:我正在尝试使用以下代码将日期值插入表 (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");
但它也不起作用。
可能是什么问题?
【问题讨论】:
改用“/”和格式“yyy/mm/dd”。 不幸的是它没有用:/ ms-access 也有一个 DateSerial(year,month,day),也许你的代码可以将它作为字符串插入。 support.office.com/en-us/article/… 尝试更改您的 INSERT 语句以指定列名,例如,INSERT INTO Alumnos (colName1, colName2, ...) VALUES (?, ?, ...)
。您似乎(无意中)尝试将文本值插入日期/时间字段。
太棒了!那工作100%没问题。我弄乱了列的顺序。我之前检查过,并认为我做对了,但是像这样编辑语句使代码将数据直接获取到正确的列。谢谢你!
【参考方案1】:
尽管大多数(如果不是全部)SQL 方言都支持不带列列表的 INSERT 语句,例如,
INSERT INTO Company VALUES (?,?, ...)
这通常被认为是不好的做法;列名应明确列出:
INSERT INTO Company (CompanyName, Address, ...) VALUES (?,?, ...)
这对于 UCanAccess 尤其重要,因为默认列顺序 (;columnOrder=DATA
) 是列的创建顺序创建,不一定是它们在 Access UI 中出现的顺序.
示例:我们创建一个名为 [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 连接 URL 中指定 ;columnOrder=DISPLAY
。
【讨论】:
这是一个非常有用的评论!感谢一百万。亲切的问候以上是关于没有列列表的 INSERT 语句的错误的主要内容,如果未能解决你的问题,请参考以下文章
TSQL 帮助 | INSERT 语句的选择列表包含的项目少于插入列表 [关闭]