Не удается найти ошибку в операторе обновления SQL - PullRequest
0 голосов
/ 07 марта 2019

Я работаю в одной викторине. Есть окно с вопросом. Который работает хорошо для сохранения вопроса. Но когда хотите обновить одно из текстовых полей и нажать сохранить, то ошибка происходит. что-то не так с синтаксисом?!

void insertCell(String tableNamer, String column, String value, int id) throws ClassNotFoundException, SQLException{
    Class.forName("org.h2.Driver");
    Connection conn = DriverManager.getConnection("jdbc:h2:file:C:/Users/Juris Puneiko/IdeaProjects/for_my_testings/src/sample/DB/Questions/For_Private/Easy", "Juris", "1");

    PreparedStatement ps = conn.prepareStatement("UPDATE ? SET ? = ? where  ID = ?");
    ps.setString(1, tableNamer);
    ps.setString(2, column);
    ps.setString(3, value);
    ps.setInt(4, id);
    ps.executeUpdate();
    ps.close();
    conn.close();
}

org.h2.jdbc.JdbcSQLException: синтаксическая ошибка в операторе SQL "UPDATE? [*] SET? =? WHERE ID =?"; ожидаемый «идентификатор»; Оператор SQL: ОБНОВИТЬ ? ЗАДАВАТЬ ? знак равно где ID =? [42001-196]

Что это такое >>> [*]?

Что это значит?

Screenshot

Ответы [ 2 ]

3 голосов
/ 07 марта 2019
String sql = "UPDATE " + tableNamer + " SET " + column + " = ? where  ID = ?";
PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, value);
    ps.setInt(2, id);
    ps.executeUpdate();
    ps.close();
    conn.close();
2 голосов
/ 07 марта 2019

Заполнители можно использовать только для значений в большинстве баз данных SQL, но не для идентификаторов, таких как имена таблиц или столбцов:

"UPDATE myTable SET myCol = ? where ID = ?" -- OK
"UPDATE ? SET ? = ? where ID = ?" -- not OK

Причина в том, что эти параметры также используются для подготовленных операторов , когда вы отправляете запрос в базу данных один раз, база данных "подготавливает" оператор, а затем вы можете использовать этот подготовленный оператор много раз. с разными значениями параметров. это может повысить производительность БД, поскольку БД может компилировать и оптимизировать запрос, а затем многократно использовать эту обработанную форму, но для того, чтобы сделать это, ей необходимо знать имена задействованных таблиц и столбцов.


Чтобы исправить это, вы оставляете значения ? только для значений и объединяете tableNamer и column вручную:

"UPDATE " + tableNamer + " SET " + column + " = ? where ID = ?"

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

...