Заполнители можно использовать только для значений в большинстве баз данных 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-кода. Убедитесь, что вы не разрешаете пользователю предоставлять или влиять на них, а также дезинфицировать пользовательский ввод.