2012-12-07 184 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不會接受它。 謝謝! –