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その状況で別のパラメーターとして処理するため、パラメーターが 7 つではなく 8 つあると見なされます。

理由を理解するには、Access データベースでエラーなしで実行される次のクエリから始めます。

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

ただし、句でフィールド名の代わりにエイリアスを使用しようとすると、値をパラメーターとして扱うためWHERE、値を指定するように求められます。foo

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

アクセスにより、後でクエリでエイリアス名を再利用する機能が制限されます。場合によっては、エイリアスが受け入れられますが、あなたのエイリアスはそのようなケースではありません。

サブクエリでエイリアスを定義できます。親クエリでサブクエリのエイリアスを参照すると、db エンジンはそれを正しく認識します。

可能であれば、SQL ステートメントを Access で直接テストします。それらが失敗した場合、その努力が原因を特定する最善の機会を与えてくれます。

于 2012-12-07T20:21:14.690 に答える