0

我有一个带表的 DDBB,users我正在尝试获取字段user_iduser_pass通过搜索user_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[][],因此我检查了前一个函数是否返回为空:

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 中选择一个项目,并运行该过程以获取基于所选项目(也不是索引)的和时,ResultSet 始终为 NULL user_iduser_pass

任何想法?谢谢。

4

3 回答 3

2

代替

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

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

单引号由PreparedStatement. 使用引号,查询将查找字符串'%usrname%'而不是%usrname%

于 2013-06-21T11:15:57.770 回答
1

尝试

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

代替

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

解决方案 正如 Marco Forberg 所指出的,用于包含字符串参数 (') 的引号不是强制性的。删除它们可以解决问题。

于 2013-06-21T12:30:58.763 回答