2012-12-07 135 views
2

我有一个SQL问题。我在Access数据库的顶部写了一个Java应用程序。 这是一个搜索查询的几个领域,我知道错误是在我需要计算一个人的年龄时,他或她失踪的部分。我在我的方法中返回tablemodel,所以我需要在查询中进行计算。我最近使它工作atempt是这样的:SQL错误太少参数

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] Too few parameters. Expected 8.

我只用7个参数工作,不知道为什么他要求8 谢谢

+0

您是否检查拼写错误的列? – Prakash

+0

你能告诉我们你的数据库模式吗? – Anov

回答

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; 

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

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

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

+0

就是这样!多么愚蠢的错误,但我不知道。修复它知道Access不会接受它。 谢谢! –