Что не так с моим утверждением JDBC mySQL?Видимо мое предложение WHERE перепутано - PullRequest
2 голосов
/ 31 марта 2011

Что не так с моим оператором JDBC mySQL? Очевидно, мое предложение WHERE испорчено. Примечание: первое значение определено в actionListener, а значение = является переменной в базе данных.

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 ]

4 голосов
/ 31 марта 2011
    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 ...

нет места
4 голосов
/ 31 марта 2011

Вы забыли пробел.

Заменить

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 перед его выполнением. Такого рода ошибки легче обнаружить.

logger.debug(selectString);

Не связанный с конкретной проблемой, вам необходимо закрыть ресурсы БД, включая ResultSet в блоке finally блока try, где они были получены. Таким образом вы предотвращаете утечку ресурсов в случае исключений.

2 голосов
/ 31 марта 2011

ОК, я вижу это.Это не совсем предложение where, это именно то, на что указывает синтаксический анализатор.Это около предложения 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'

Проблема в том, что у вас нет пробелов между «доступностью» и «ОТ» или между «транзакцией» и «ГДЕ»,Если вы добавите пробелы в конце строк в каждой строке, это должно сработать.

Такая ошибка повторяется постоянно.У меня появилась привычка добавлять дополнительный пробел в конец любой строки запроса SQL в моих приложениях, чтобы предотвратить случайное выполнение этого при последующем изменении запроса.

Кроме того, обратите внимание, что «транзакция» - этозарезервированное словоХотя вы, похоже, не сталкиваетесь с проблемами, вы можете случайно найти их в будущем, когда анализатор интерпретирует их как ключевое слово вместо имени таблицы / поля.Цитирование (с обратными галочками в MySQL) поможет с этим, но если это возможно, вы можете переименовать его.Эти ошибки «Я случайно использовал ключевое слово в качестве имени» могут быть настоящей болью для отслеживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...