ошибка индекса неверного столбца с оператором Prepare - PullRequest
1 голос
/ 11 августа 2011

Я получаю invalid column index за следующее подготовленное утверждение.
Вот мой код

// Excluding some unnecessary code
counter = 1;
if (rsTableNames.next()) 
{
    // Creating Query for prepared statement
    String getCode = "select * from ( select c_name from " 
          + rsTableNames.getString(1)+ " where lower(c_name) like ?%'";
    while (rsTableNames.next()) 
    {
      getCode += " union select c_name from " + 
      rsTableNames.getString(1)+ " where lower(c_name) like ?%'";
      counter++;
    }
    getCode += " ) where rownum <= " + maxRecords;
        // Now  The getCode contains 3 place holders ie ?           
    pst = con.prepareStatement(getCode);
    String param = "'" + query.toLowerCase();

    for(int i=1;i<=counter;i++)
    {
        pst.setString(i,param);  // when i=3 exception is thrown
    }
}

Я получаю исключение, когда i становится 3, хотя запрос содержит 3 заполнителя.
РЕДАКТИРОВАТЬ (подсказка): Я думаю, что проблема с ', который создает хаос.Как мы можем избежать этого?

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

Я не знаю, является ли это причиной проблемы, но я не думаю, что параметры работают так, как вы думаете, что они делают, когда дело доходит до цитирования.Вы по-прежнему добавляете кавычки в свой код после каждого параметра и в качестве начала вашего параметра.Я подозреваю, что вы просто хотите:

rsTableNames.getString(1)+ " where lower(c_name) like ?";

в каждом месте, затем:

String param = query.toLowerCase() + "%";

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

0 голосов
/ 11 августа 2011

вы уверены, что есть 3?в sql?попробуйте распечатать весь подготовленный элемент в цикле for.

Я подозреваю, что многие из имеющихся у вас циклов могли работать не так, как вы ожидали, и в итоге в подготовленном состоянии было только 2 параметра.

Какое исключение было выброшено?Из API Java: Throws: SQLException - если параметрIndex не соответствует маркеру параметра в инструкции SQL;если возникает ошибка доступа к базе данных или этот метод вызывается на закрытом PreparedStatement

, также, если вы используете совместно соединение con и экземпляр con.preparedStatement, убедитесь, что вы правильно закрыли каждое из них

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