SQL错误参数太少

时间:2012-12-07 18:13:17

标签: java sql ms-access

我有一个SQL问题。我在Access数据库上编写了一个java应用程序。 这是几个字段的搜索查询,我知道错误是在我需要计算一个人失踪时的年龄的部分。我正在我的方法中返回一个tablemodel所以我需要在我的查询中进行计算。我的最新尝试是:

public TableModel UpdateTable(String dossiernr, String naam, String voornaam,
    String startleeftijd, String eindleeftijd, String dossierjaar, String geslacht)
{
    TableModel tb = null;
    String sql= "SELECT [Nr dossier],[Annee],[Nom],[Prenom],[Disparu le],[Ne le],[Sexe], DATEDIFF('yyyy',[Ne le],[Disparu le]) - iif(DATEADD('yyyy', DATEDIFF('yyyy',[Ne le],[Disparu le]),"
        + "[Ne le])>[Disparu le],1,0) AS Age FROM TotalTable "
        + "WHERE [Nr dossier] LIKE ? AND [Nom] LIKE ? AND [Prenom] LIKE ? AND [Annee] LIKE ? AND Age >= ? AND Age <= ? AND [Sexe] LIKE ?;";

    try
    {
        PreparedStatement pstatement;
        Connection connection = PersistentieController.getInstance().getConnection();

        pstatement = initStatement(connection,sql);
        pstatement.setString(1, "%" + dossiernr + "%");
        pstatement.setString(2, "%" + naam + "%");
        pstatement.setString(3, "%" + voornaam + "%");
        pstatement.setString(4, "%" + dossierjaar + "%");
        pstatement.setString(5, startleeftijd);
        pstatement.setString(6, eindleeftijd);
        pstatement.setString(7, "%" + geslacht + "%");
        rs=pstatement.executeQuery();
        tb = DbUtils.resultSetToTableModel(rs);
        pstatement.close(); 
    }//einde try
    catch (SQLException e)
    {
        e.printStackTrace();
    } //einde catch

    return tb;
} 

当我运行它时,我得到以下错误:

  

java.sql.SQLException:[Microsoft] [ODBC Microsoft Access Driver]参数太少。预计8。

我只使用7个参数而不知道为什么他要求8。 感谢

1 个答案:

答案 0 :(得分:2)

您在WHERE子句中计算了7个参数。不幸的是,Access数据库引擎将Age视为该情况下的另一个参数,因此它认为您有8个参数而不是7个。

要理解原因,请从我的Access数据库中运行且无错误运行的查询开始:

SELECT some_text AS foo
FROM tblFoo
WHERE some_text Is Not Null;

但是,当尝试在WHERE子句中使用别名而不是字段名时,Access会提示我为foo提供值,因为它将其视为参数:

SELECT some_text AS foo
FROM tblFoo
WHERE foo Is Not Null;

访问限制了您稍后在查询中重用别名的能力。在某些情况下,它会接受别名,但你的不是其中之一。

您可以在子查询中定义别名。然后,当您在父查询中引用子查询的别名时,db引擎将正确识别它。

如果可能,直接在Access中测试SQL语句。如果他们失败了,那么这种努力将给你最好的机会来确定原因。