没有列列表的 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 语句的错误的主要内容,如果未能解决你的问题,请参考以下文章

sql insert into语句错误

TSQL 帮助 | INSERT 语句的选择列表包含的项目少于插入列表 [关闭]

insert语句返回值

使用 DEFAULT 值准备 MySQL INSERT/UPDATE 语句

SQL的INSERT怎么可以一次插入多项数据?

简化的INSERT语句