проблема в JDBC подготовить заявление - PullRequest
0 голосов
/ 17 мая 2010

Я получаю ошибку, когда пытаюсь использовать следующее, почему это так?

ResultSet findByUsername(String tablename,String field,String value)
{ 
    pStmt = cn.prepareStatement("SELECT * FROM" + tablename +" WHERE ? = ? ");

    pStmt.setString(1,field);
    pStmt.setString(2,value);
    return(pStmt.executeQuery());

}

также я попытался следовать, но он тоже не работает

ResultSet findByUsername(String tablename,String field,String value)
{ 
    String sqlQueryString = " SELECT * FROM " + tablename +" WHERE " + field + "= ? ")     
     pStmt =cn.prepareStatement(sqlQuery);
    pStmt.setString(1, value);
    return(pStmt.executeQuery());

}

Ответы [ 5 ]

3 голосов
/ 17 мая 2010

У вас есть:

pStmt = cn.prepareStatement("SELECT * FROM" + tablename +" WHERE ? = ? ");
pStmt.setString(1, tablename);
pStmt.setString(2,field);
pStmt.setString(3,value);

Два ?, но пытается установить три параметра.

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

Вам также нужно будет последовательно произносить имена переменных и что-то делать с проверенными исключениями.

(Задавая вопросы о коде, который вызывает ошибки, обычно рекомендуется цитировать ошибки.)

1 голос
/ 17 мая 2010

Я вижу две проблемы здесь:

  1. "+ tablename +" следует заменить на ?
  2. WHERE ?=? совершенно неверно из-за концепции подготовленных высказываний. Подготовленные операторы - это предварительно скомпилированные операторы, ссылающиеся на одну и ту же таблицу (и) и столбец (и) с разными значениями в criterea (связанные значения). Вы не можете связать имя таблицы или столбца (или любой другой объект БД).
0 голосов
/ 17 мая 2010

При второй попытке с одним кодом на строковое значение.

String sqlQueryString = " SELECT * FROM " + tablename +" WHERE " + filed + " = ? ");

использовать один код при сравнении строковых значений. Оставьте пробел между полем и равным.

спасибо

0 голосов
/ 17 мая 2010

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

ResultSet findByUsername(String tablename,String field,String value)
{ 
    pStmt = cn.prepareStatement("SELECT * FROM" + tablename +" WHERE " + field" + = ? ");
    pStmt.setString(1,value);
    return(pStmt.executeQuery());    
}
0 голосов
/ 17 мая 2010

При использовании PreparedStatement s вы можете подставлять только значения, а не имена таблиц, как вы пытаетесь сделать с помощью "WHERE? =?".

Что касается вашего второго фрагмента кода, кроме орфографической ошибки ("поданной"), я не могу понять, почему это не получится. Какую ошибку вы получаете?

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