更新语句Java sql异常:期望的参数太少

Posted

技术标签:

【中文标题】更新语句Java sql异常:期望的参数太少【英文标题】:update statement Java sql exception: Too few parameters expected one more 【发布时间】:2014-05-17 12:36:27 【问题描述】:

所以我有一种方法可以更新 MS Access 2007 表中的某些字段,每当我尝试更新时,都会出现以下异常: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 参数太少。预计11。 它总是显示比查询中的预期多一个。

方法的代码是:

try 
        String upit = "UPDATE Izlagac SET NazivIzlagaca=?, PIB=?, Telefon=?, "
                + " KontaktOsoba=?, Email=?, TipIzlagaca=?, Ulica=?, Broj=?, Mesto=?, Drzava=? WHERE "
                + " SifraIzlagaca = " + i.getSifraIzlagaca() + ";";
        PreparedStatement pstmt = con.prepareStatement(upit);
        pstmt.setString(1, i.getNazivIzlagaca());
        pstmt.setString(2, i.getPIB());
        pstmt.setString(3, i.getTelefon());
        pstmt.setString(4, i.getKontaktOsoba());
        pstmt.setString(5, i.getEmail());
        pstmt.setString(6, i.getTipIzlagaca());
        pstmt.setString(7, i.getUlica());
        pstmt.setString(8, i.getBroj());
        pstmt.setString(9, i.getMesto());
        pstmt.setString(10, i.getDrzava());
        System.out.println(pstmt.toString());
        pstmt.executeUpdate();
        pstmt.close();
        return true;
     catch (SQLException ex) 
        Logger.getLogger(DBBroker.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    

我没有使用别名,所以这似乎不是驱动程序期望附加参数的原因。所有列名拼写正确,三重检查。

【问题讨论】:

i.getSifraIzlagaca() 不会碰巧返回问号,对吧? 不,它返回一个正常的字符串和正确的值。 为什么不使用... WHERE SifraIzlagaca = ?pstmt.setString(11, i.getSifraIzlagaca()); 我没有看到 i.getSifraIzlagaca() 实际上是用引号括起来的!从未使用过 MS Access,但字符串参数不应该在标准 SQL 中引用吗? Anirban Basak,是的,它不是,但是当你包装它时,它会引发数据错误类型异常。 Gord,谢谢,它现在可以工作了,这是一个简单而优雅的解决方案,从现在开始我会这样做.. :) 虽然它也应该这样工作,但那是邪恶的 Microsoft 驱动程序 :) 【参考方案1】:

无需使用字符串连接来构建 WHERE 子句;参数在那里和在 PreparedStatement 的其他部分一样有效。所以,只需使用

String upit = "UPDATE Izlagac SET NazivIzlagaca=?, PIB=?, Telefon=?, "
        + " KontaktOsoba=?, Email=?, TipIzlagaca=?, Ulica=?, Broj=?, Mesto=?, Drzava=? WHERE "
        + " SifraIzlagaca=?";
PreparedStatement pstmt = con.prepareStatement(upit);
pstmt.setString(1, i.getNazivIzlagaca());
pstmt.setString(2, i.getPIB());
pstmt.setString(3, i.getTelefon());
pstmt.setString(4, i.getKontaktOsoba());
pstmt.setString(5, i.getEmail());
pstmt.setString(6, i.getTipIzlagaca());
pstmt.setString(7, i.getUlica());
pstmt.setString(8, i.getBroj());
pstmt.setString(9, i.getMesto());
pstmt.setString(10, i.getDrzava());
pstmt.setString(11, i.getSifraIzlagaca());

【讨论】:

是的,我意识到,经过上面的 cmets 并更正后,它现在可以正常工作了,谢谢 :)

以上是关于更新语句Java sql异常:期望的参数太少的主要内容,如果未能解决你的问题,请参考以下文章

执行sql语句异常...需要的参数与提供的值个数不匹配

java jdbc 删除数据库表中一列后不能用SQL语句在更新和查询表中其他数据了

SQL异常列无效,java sql语句

使用准备好的语句时出现 Camel -Spring SQLException

mybatis批量更新不同参数多条语句带分号update报错的解决方案

java jdbc sql语句参数的设置