Подготовленное заявление в if else

Я пытаюсь использовать подготовленный оператор в if else. К сожалению, я получаю, что Индекс 1 выходит за пределы допустимого диапазона. Добавлены некоторые детали ... Мой код:

try {
        String query = "select * from dbo.Table";
        String width = jFormattedTextField1.getText();
        String heigth = jFormattedTextField2.getText();
        PreparedStatement ps;

        if (width.equals("") && heigth.equals("")) {
            query = "select * from dbo.Table ";
        } else if (width != null && !"".equals(width) && heigth != null && !"".equals(heigth)) {
            query += "where width = ? and heigth = ?";
            ps = conn.prepareStatement(query);
            ps.setString(1, width);
            ps.setString(2, heigth);
        } else if (width != null && heigth.equals("")){
            query += "where width = " + width;
            ps = conn.prepareStatement(query);
        } else {
        query += "where heigth = " + heigth;
        ps = conn.prepareStatement(query);
    }
        ps = conn.prepareStatement(query);
        ResultSet rs = ps.executeQuery();
        jTable1.setModel(DbUtils.resultSetToTableModel(rs));
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e, "ERROR", JOptionPane.ERROR_MESSAGE);
    }

Да я пропустил +

n0rek 11.04.2018 11:59

Почему этот помеченный sql-сервер? PreparedStatement - это Oracle.

paparazzo 11.04.2018 12:01

@paparazzo Согласен, но обратите внимание, что PreparedStatement - это класс из javax.sql, он не имеет ничего общего с СУБД Oracle. Это просто класс для обработки подготовленных операторов, независимо от СУБД.

BackSlash 11.04.2018 12:11
1
3
1 786
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны создать PreparedStatement после инициализации SQL String, что означает, что это должно быть сделано внутри тела if-else.

        String width = jFormattedTextField1.getText();
        String heigth = jFormattedTextField2.getText();
        PreparedStatement ps;
        if (width.equals("") && heigth.equals("")) {
            query = "select * from dbo.Table ";
            ps = conn.prepareStatement(query);
        } else if (width != null && !"".equals(width) && heigth != null && !"".equals(heigth)) {
            query = "select * from dbo.Table where width = ? and heigth = ?";
            ps = conn.prepareStatement(query);
            ps.setString(1, width);
            ps.setString(2, heigth);
        }

Вы также должны инициализировать PreparedStatement в предложении else, чтобы убедиться, что он инициализирован, прежде чем выполнять его.

РЕДАКТИРОВАТЬ:

Увидев обновленный код, вы неправильно используете PreparedStatement в последних двух случаях. Я предлагаю:

try {
    String query = "select * from dbo.Table";
    String width = jFormattedTextField1.getText();
    String height = jFormattedTextField2.getText();
    PreparedStatement ps;

    if (width.equals("") && height.equals("")) {
        ps = conn.prepareStatement(query);
    } else if (width != null && !"".equals(width) && height != null && !"".equals(height)) {
        query += " where width = ? and height = ?";
        ps = conn.prepareStatement(query);
        ps.setString(1, width);
        ps.setString(2, height);
    } else if (width != null && height.equals("")){
        query += " where width = ?";
        ps = conn.prepareStatement(query);
        ps.setString(1, width);

    } else {
        query += " where height = ?";
        ps = conn.prepareStatement(query);
        ps.setString(1, height);
    }
    ResultSet rs = ps.executeQuery();
    jTable1.setModel(DbUtils.resultSetToTableModel(rs));
} catch (Exception e) {
    JOptionPane.showMessageDialog(null, e, "ERROR", JOptionPane.ERROR_MESSAGE);
}

Хорошо, но теперь я получаю ошибку "Не задано значение для параметра 1"

n0rek 11.04.2018 12:10

@ n0rek Это не имеет смысла, поскольку вы устанавливаете параметр 1 сразу после создания PreparedStatement (по крайней мере, в моем ответе). Возможно, у вас есть другой код, в котором вы создаете PreparedStatement с параметрами и не устанавливаете их.

Eran 11.04.2018 12:12

@ n0rek вы не показали, где объявлен query. Возможно, он имеет предыдущее значение (с параметрами), когда вы присоединяете к нему запрос без параметров (в query += "select * from dbo.Table ";). Я предлагаю вам не использовать конкатенацию.

Eran 11.04.2018 12:16

Я отредактировал свой вопрос и обновил весь код, который используется в jButtonActionPerformed.

n0rek 11.04.2018 12:21

@ n0rek у вас есть дополнительный ps = conn.prepareStatement(query); после оператора if-else-if. Убери это.

Eran 11.04.2018 12:24

Вы инициализировали переменную ps после ps.setString, это правильно? Также теперь возникает ошибка: переменная ps могла быть не инициализирована ResultSet rs = ps.executeQuery ();

n0rek 11.04.2018 12:39

@ n0rek ой, я потерял его. исправлено сейчас. Также обратите внимание, что я добавил ps = conn.prepareStatement(query); в первую ветвь оператора if.

Eran 11.04.2018 12:42

Да, что ps = conn.prepareStatement (query); сделал работу, большое вам спасибо. Подскажите, пожалуйста, как отмечать код в комментариях, как вы?

n0rek 11.04.2018 12:46

@ n0rek просто окружите его, так как кавычки ``

Eran 11.04.2018 12:47

Другие вопросы по теме