2

我遇到了一个 sql 问题。我在 Access 数据库之上编写了一个 java 应用程序。这是几个字段的搜索查询,我知道错误出现在我需要计算一个人失踪时的年龄的部分。我在我的方法中返回了一个表模型,所以我需要在我的查询中进行计算。我最近的尝试是这样的:

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 个。谢谢

4

1 回答 1

3

您在WHERE子句中计算了 7 个参数。不幸的是,在这种情况下,Access db 引擎将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;

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

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

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

于 2012-12-07T20:21:14.690 回答