ORA-01036 - недопустимое имя / номер переменной - PullRequest
0 голосов
/ 16 мая 2018

У меня есть динамический SQL для поиска записей в Oracle, и анализ анализа кода VS2017 предупреждает об использовании параметризованного SQL-запроса для этой строки (1-я строка, этот код работает):

string SQL = "SELECT " + string.Join(",", my_columns.ToArray()) + " FROM MyTable ";
string where_condition = " WHERE ";

//the rest of code follows as this...
if (!string.IsNullOrEmpty(textbox1.Text))
{
  SQL = string.Concat(SQL, where_condition, " Name like :name");
  cmd.Parameters.Add(new OracleParameter("name", string.Concat("%", textbox1.Text, "%")));
  where_condition = " AND ";
} //...

Итак, я попыталсядля имен столбцов в качестве параметров из-за предупреждения, но затем я получаю ORA-01036- недопустимая ошибка имени / номера переменной:

 string SQL = "SELECT :columns FROM MyTable ";
 cmd.Parameters.Add(new OracleParameter("columns", string.Join(",", 
 my_columns.ToArray())));
 string where_condition = " WHERE ";

Что не так, возможно, имена столбцов не могут быть переданы в качестве параметров?Или есть другой способ избежать предупреждения при анализе кода VS?

1 Ответ

0 голосов
/ 16 мая 2018

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

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

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

...