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-инъекции.