0

テーブルを持つ DDBB があり、フィールドをusers取得しようとしていて、 を検索しています。したがって、次のクエリを実行すると:user_iduser_passuser_name

SELECT `user_id`, `user_pass` FROM `users` WHERE `user_name` LIKE '%aName%';

つまり、aName = "John" が返されます。

+---------+-----------+
| user_id | user_pass |
+---------+-----------+
|    5    |  "1234"   |
+---------+-----------+

さて、PreparedStatement を使用してこれを実行したいので、この関数を作成しました。

private final String QUERY_GETUSERNAME2 =
        "SELECT `user_id`, `user_fname`"
        + " FROM `users`"
        + " WHERE `user_fname` LIKE ?;";

private String[][] getUsersInv(String usrName){
    ArrayList<String[]> alAux = new ArrayList();
    String[][] ret = null;
    try{
        PreparedStatement st = _conn.prepareStatement(QUERY_GETUSERNAME2);
        st.setString(1, "'%"+usrName+"%'");
        ResultSet rs = st.executeQuery();
        while(rs.next()){
            String[] asAux = {String.valueOf(rs.getInt(1)), rs.getString(2)};
            alAux.add(asAux);
        }//while
    }catch(SQLException e){
        e.printStackTrace(System.out);
    }finally{
        if (!alAux.isEmpty()){
            ret = new String[alAux.size()][alAux.get(0).length];
            for (int i = 0; i < alAux.size(); i++)
                ret[i] = alAux.get(i);
        }//fi
    }
    return ret;
}

ご覧のとおり、関数は String[][] を返すため、戻り値が null であるかどうかを前の関数でチェックインします。

public void insertUsersInvTableModel(JTable table, String user){
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    String[][] row = getUsersInv(user);
    if (row != null)
        model.addRow(row);
}

そして、この関数は JButton のリスナーから呼び出されます。

private void addUserActionPerformed(java.awt.event.ActionEvent evt) {                                        
    if (comboUsers.getSelectedIndex() != 0){
        new Users(_conn).insertUsersInvTableModel(_target, String.valueOf(comboUsers.getSelectedItem()));
        _target.validate();
        _target.repaint();
        setVisible(false);
    }
}

ご想像のとおり、すべてのユーザーが一覧表示された JComboBox を持つ JDialog があります。テーブルusersは AUTO_INCREMENT であるため、user_idいくつかのギャップがあり (またはギャップがある可能性があります)、JComboBox を構築する唯一の方法は、user_idJComboBox インデックスに関連付けないことでした。

しかし、問題は、JComboBox から項目を選択し、選択した項目 (またはインデックス) に基づいてuser_idandを取得するプロセスを実行するたびに、ResultSet が常に NULL になることです。user_pass

何か案が?ありがとう。

4

3 に答える 3

1

試す

st.setString(1, "%"+usrName+"%");

それ以外の

st.setString(1, "'%"+usrName+"%'");
于 2013-06-21T11:17:13.243 に答える
0

解決策 Marco Forberg が指摘したように、文字列パラメーター (') を囲むために使用される引用符は必須ではありません。それらを削除すると、問題が解決します。

于 2013-06-21T12:30:58.763 に答える