我的JDBC mySQL语句出了什么问题?显然我的WHERE子句是混乱的

时间:2011-03-31 17:52:53

标签: java mysql jdbc

我的JDBC mySQL语句出了什么问题?显然我的WHERE子句搞砸了。注意:第一个值在actionListener中定义,= value是数据库中的变量。

searchBtn.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        list.clearSelection();

        //connect to database

        String afName= auth_fName.getText();
        String aMI =  auth_MI.getText();
        String alName = auth_lName.getText();

        String tField = titleField.getText();
        String sField = subjectField.getText();

        //PR.111.002 - “Core Java”,  Cay Horstmann  - AVAILABLE

        try
        {
            Connection conn = Database.getConnection();

            Statement s = conn.createStatement();

            if (!afName.equals("") && (!aMI.equals ("")) && (!alName.equals(""))&& (!tField.equals("")) && (!sField.equals("")))
            {
                selectString = "SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availability"
                                + "FROM book, transaction"
                                + "WHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI'"
                                + " AND title = 'title' AND sField = 'subject'";
                result ="";

            }

            s = conn.createStatement();
            ResultSet rs = s.executeQuery(selectString);
            while (rs.next())
                {
                    String call_Number = rs.getString("call_Number");
                    String title = rs.getString("title");
                    String auth_lName = rs.getString("auth_lName");
                    String auth_MI = rs.getString ("auth_MI");
                    String auth_fName = rs.getString("auth_fName");
                    String availability = rs.getString("availability");

                view = new View (call_Number, title, auth_lName, auth_MI, auth_fName, availability);

                vList.add(view);
                }
        s.close();
        conn.close();

        list.setListData(vList.toArray());

        } catch (Exception ex) {

            ex.printStackTrace();
        }
    }
});

3 个答案:

答案 0 :(得分:4)

你忘记了一些空白。

替换

selectString = "SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availability"
    + "FROM book, transaction"
    + "WHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI'"
    + " AND title = 'title' AND sField = 'subject'";

通过

selectString = "SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availability"
    + " FROM book, transaction"
    + " WHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI'"
    + " AND title = 'title' AND sField = 'subject'";

对于将来出现的SQL问题,如果在执行SQL语句或PreparedStatement之前打印/调试SQL语句,则会对自己有所帮助。然后可以更容易地发现这种错误。

logger.debug(selectString);

对具体问题

无关,您需要关闭数据库资源,包括ResultSetfinally块中的try 。这样可以防止出现异常时资源泄漏。

答案 1 :(得分:4)

    selectString = "SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availability"
                + "FROM book, transaction"
                + "WHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI'"
                + " AND title = 'title' AND sField = 'subject'";

问题是你在交易 WHERE 之间没有空格......

答案 2 :(得分:2)

好的,我明白了。它不完全是where子句,这正是解析器指向的内容。它是 near where子句。如果删除换行符,则以下是SQL的内容:

SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availabilityFROM book, transactionWHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI' AND title = 'title' AND sField = 'subject'

问题是“可用性”和“FROM”之间或“事务”和“WHERE”之间没有空格。如果在每行的字符串末尾添加空格,它应该可以工作。

这种错误一直在发生。我习惯在我的应用程序的任何一行SQL查询的末尾添加一个额外的空格,以防止我在以后更改查询时意外地执行此操作。

另外,请注意“交易”是保留字。虽然您似乎没有遇到问题,但您可能会在将来意外地找到解析器将其解释为关键字而不是表/字段名称的问题。引用它(使用MySQL中的反引号)将有助于此,但如果可能的话,您可以重命名它。那些“我不小心用一个关键字作为名字”的错误可能是一个非常痛苦的追踪。