ASP.NET передает значение из текстового поля в команду выбора с IN vb

У меня есть веб-страница asp.net с сеткой asp.net со следующим запросом:

 SelectCommand="SELECT * from details2 as t2 WHERE (t2.OCC IN ('+ @txtCOUNTRY +') OR t2.DCC IN ('+ @txtCOUNTRY +')) and t2.ac='Y'"

Текстовое поле txtCOUNTRY Значение может иметь следующие значения (например):

'AR', 'ES'

Однако параметр @txtCOUNTRY не выглядит должным образом, написано, так как gridview ничего не показывает.

если я изменю это на (например), это работает:

 SelectCommand="SELECT * from details2 as t2 WHERE (t2.OCC IN ('AR,'ES') OR t2.DCC IN ('AR','ES')) and t2.ac='Y'"

Так что я могу только предположить, @txtCOUNTRY параметр неправильно написан.

Есть идеи?

1 ответ

Когда вы передаете значения 'AR','ES' через параметр SQL они будут автоматически экранированы, что заставит ваш запрос буквально искать значение: 'AR','ES',

Смотрите это: Параметризация предложения SQL IN

Так что в вашем случае (поскольку у вас есть список значений, разделенных запятыми, каждое в одинарных кавычках):

SelectCommand = "SELECT * from details2 as t2 WHERE " &
    "(','+@txtCOUNTRY+',' LIKE '%'','+t2.OCC+''',%' OR ','+@txtCOUNTRY+',' LIKE '%'','+t2.DCC+''',%') " & 
    "and t2.ac='Y'"

Если вы не заключаете свои значения в одинарные кавычки (например: AR,ES) тогда запрос становится немного более читабельным, поскольку вам не нужно экранировать одинарные кавычки в запросе:

SelectCommand = "SELECT * from details2 as t2 WHERE " &
    "(','+@txtCOUNTRY+',' LIKE '%,'+t2.OCC+',%' OR ','+@txtCOUNTRY+',' LIKE '%,'+t2.DCC+',%') " & 
    "and t2.ac='Y'"

Изменить, чтобы обеспечить некоторую ясность относительно того, почему это работает.

Так, например, предоставляя AR,ES в качестве значения для @txtCOUNTRY Параметр даст условие:

,AR,ES, LIKE *,[t2.OCC],*   OR   ,AR,ES, LIKE *,[t2.DCC],*

Это условие будет соответствовать, если либо t2.OCC или же t2.DCC были либо AR или же ES потому что шаблон будет соответствовать.

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

Другие вопросы по тегам