Экранируйте символ двойной кавычки в строке, представляющей sql-запрос

#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 или в литерале для значения параметра. Использование параметров хорошо для значений переменных и особенно для пользовательского ввода, но это ни то, ни другое. По крайней мере, то, что показано в вопросе, не является ни тем, ни другим. Хотя, возможно, это не соответствует реальному коду.