#vb.net
Вопрос:
Я пытаюсь использовать строку для представления SQL-запроса в VB. т. е.
dim sSql As string
sSql = "SELECT thing FROM example where xml NOT LIKE '%<FUNDED YESNO=""YES"">%'"
Проблема в том, что когда это передается в SQL, кажется, что он передает двойные кавычки, которые я использовал, чтобы избежать здесь YESNO=»»ДА»», что вызывает проблемы.
Как правильно избежать этих двойных кавычек? Я пытался
sSql = "SELECT thing FROM example where xml NOT LIKE '%<FUNDED YESNO=" amp; Chr(34) amp; "YES" amp; Chr(34) amp; ">%'
безрезультатно.
Комментарии:
1.
which causes issues
… какие проблемы? Есть ли какое-либо сообщение об ошибке? Какие СУБД вы используете?2. Это невозможно. В
String
нем содержится только одна двойная кавычка. Дополнительная двойная кавычка-это просто буквальное представление, очень похожее на обратную косую черту в литерале C#. Как именно вы определяете, что это, по-видимому, так?3. @jmcilhinney Я просматриваю код с помощью visual studio и выясняю, какова ценность sSql при его передаче
4. Используйте параметры. К какой базе данных вы подключаетесь (например, MySQL, SQL Server, …)?
5. Обратите внимание, что в окне просмотра отладки будут отображаться строки с экранированием в том же формате, что и язык отладки. Если вы хотите увидеть это иначе, вам нужно будет использовать средство просмотра, которое открывается при нажатии на значок увеличительного стекла в часах.
Ответ №1:
Лично я бы все равно предпочел использовать для этого параметризованный запрос:
Dim Sql As string = "SELECT thing FROM example where xml NOT LIKE '%' @Search '%'"
Using cn As New SqlConnection("connection string here"), _
cmd As New SqlCommand(Sql, cn)
cmd.Parameters.Add("@xml", SqlDbType.NVarChar, 4000).Value = "<FUNDED YESNO=""YES"">"
cn.Open()
' ...
End Using
Я обещаю, что строка, используемая для совпадения, в конечном итоге будет выглядеть так:
<FUNDED YESNO="YES">
Параметризованные запросы, как правило, обходят стороной такого рода проблемы, в любом случае, и они очень важны для предотвращения ошибок и атак при внедрении SQL.
Теперь вы также можете легко переработать этот код в метод, с помощью которого вы можете отправить любой нужный вам ключ поиска.
Комментарии:
1. Использование параметра здесь не решает никаких проблем. Значение жестко закодировано, и вы должны избегать двойных кавычек, независимо от того, находятся ли они в литерале для кода SQL или в литерале для значения параметра. Использование параметров хорошо для значений переменных и особенно для пользовательского ввода, но это ни то, ни другое. По крайней мере, то, что показано в вопросе, не является ни тем, ни другим. Хотя, возможно, это не соответствует реальному коду.