Я создаю функцию поиска в классе, который будет использоваться несколькими нашими страницами asp. Идея проста, взять поисковый запрос от пользователя и запросить базу данных для элемента. В настоящее время я делаю это неправильно, так как уязвим для атак с использованием SQL-инъекций (и ELMAH существует, чтобы спасти день, если что-то пойдет не так):
Public Shared Function SearchByName(ByVal searchterm As String) As DataTable
SearchByName = New DataTable
Dim con As New OracleConnection(System.Configuration.ConfigurationManager.ConnectionStrings("OracleDB").ConnectionString)
Try
con.Open()
Dim SqlStr As String = "select ID_ELEMENT, ELEMENT_NAME from table_of_elements where upper(ELEMENT_NAME) like upper('%" & searchterm & "%')"
Dim cmd As New OracleCommand(SqlStr, con)
SearchByName.Load(cmd.ExecuteReader)
Catch ex As Exception
Elmah.ErrorSignal.FromCurrentContext().Raise(ex)
End Try
con.Close()
con.Dispose()
Return SearchByName
End Function
Конкатенация строк ПЛОХА. Следующая вещь, которую вы знаете, Бобби Таблицы разрушает мою систему.
Теперь правильный способ сделать это - создать правильную переменную oracle, поместив в строку: searchterm и добавив следующую строку:
cmd.Parameters.Add(New OracleParameter("SEARCHTERM", searchterm))
Проблема в том, что, поскольку я использую оператор like, мне нужно иметь возможность иметь% по обе стороны от поискового слова, и я не могу сделать это с помощью '%: searchterm%', он просто дает ошибка ORA-01036: недопустимое имя / номер переменной.
Могу ли я параметризировать, но при этом иметь в своем составе свое гибкое утверждение типа?