#c# #wpf
#c# #wpf
Вопрос:
У меня есть 4 текстовых поля. Я использую каждый из них в качестве параметра фильтра для DataGrid. Проблема в том, что я должен охватить все возможные варианты с помощью функции IF, чтобы заставить их работать правильно. Есть ли лучший способ сделать это?
Ниже приведен один пример, который не охватывает даже все варианты. Мне также нужно изменить его для каждого текстового поля отдельно.
Вот код:
private void BusinessIDSearch_PreviewKeyDown(object sender, KeyEventArgs e)
{
_conditions["name"] = null;
if (!string.IsNullOrEmpty(BusinessIDSearch.Text))
{
_conditions["name"] = string.Format("LY Like '{0}%'", BusinessIDSearch.Text);
UpdateFilter();
FICount.Content = DataGrid1.Items.Count;
}
if (!string.IsNullOrEmpty(NameSearch.Text) amp;amp; string.IsNullOrEmpty(BusinessIDSearch.Text))
{
_conditions["name"] = string.Format("HAKUNIMI Like '%{0}%' AND LY Like '%{1}%'", NameSearch.Text, BusinessIDSearch.Text);
UpdateFilter();
FICount.Content = DataGrid1.Items.Count;
}
if (!string.IsNullOrEmpty(NameSearch.Text) amp;amp; !string.IsNullOrEmpty(GroupSearch.Text))
{
_conditions["name"] = string.Format("HAKUNIMI Like '%{0}%' AND KONSERNI Like '%{1}%' AND YRNRO Like '{2}%'", NameSearch.Text, GroupSearch.Text, IDSearch.Text);
UpdateFilter();
FICount.Content = DataGrid1.Items.Count;
}
if (!string.IsNullOrEmpty(BusinessIDSearch.Text) amp;amp; !string.IsNullOrEmpty(GroupSearch.Text) amp;amp; !string.IsNullOrEmpty(NameSearch.Text) amp;amp; !string.IsNullOrEmpty(IDSearch.Text))
{
_conditions["name"] = string.Format("HAKUNIMI Like '%{0}%' AND KONSERNI Like '%{1}%' AND YRNRO Like '{2}%' AND LY Like '{3}%'", NameSearch.Text, GroupSearch.Text, IDSearch.Text, BusinessIDSearch.Text);
UpdateFilter();
FICount.Content = DataGrid1.Items.Count;
}
}
Обновить:
Это приложение должно использоваться только на определенных локальных компьютерах, поэтому не должно быть рисков внедрения SQL. Однако я знаю, что это не лучшая «кодировка».
Комментарии:
1. 1) WPF и MVVM: используйте привязки вместо событий, а в установщиках свойств вызывайте
UpdateFilter()
метод модели представления . 2) Вы можете создавать фильтр динамически:X Like ...
= строка. Соедините разделитель » И «. Для рабочего кода рассмотрите возможность использования codereview в следующий раз.2. Затем добавьте соответствующие условия в список
condition = string.Join(" AND ", list);
. Таким образом, вам не нужно писать все возможные комбинации условий вручную.3. @grek40 можете ли вы привести пример в ответе, чтобы другие могли использовать это в будущем?
4. @hatman, «… не должно быть рисков внедрения SQL» — опасный способ мышления. Ваш код живет за пределами вас — кто-то будет использовать его в другом месте и / или ваше приложение будет доступно другим пользователям за пределами вашей компании. Кроме того, кто-то в вашей компании может решить «поиграть». Я всегда кодирую для SQL-инъекций и других уязвимостей.
5. @n8wrl Это правда! Я перепишу все, прежде чем оно попадет в чужие руки надлежащим образом!
Ответ №1:
Как насчет чего-то подобного:
Идея состоит в том, чтобы проверять каждый из ваших параметров по очереди и создавать строку запроса. Также обратите внимание, что вы не должны слепо передавать введенный пользователем текст в базу данных — вам нужно защититься от внедрения SQL.
string qry = null;
if (!string.IsNullOrEmpty(BusinessIDSearch.Text))
{
qry = string.Format("LY Like '{0}%'", DeInjectText(BusinessIDSearch.Text));
}
if (!string.IsNullOrEmpty(NameSearch.Text))
{
if (!string.IsNullOrEmpty(qry))
qry = " AND ";
qry = string.Format("HAKUNIMI Like '%{0}%'", DeInjectText(NameSearch.Text));
}
if (!string.IsNullOrEmpty(GroupSearch.Text))
{
if (!string.IsNullOrEmpty(qry))
qry = " AND ";
qry = string.Format("KONSERNI Like '%{0}%'", DeInjectText(GroupSearch.Text));
}
....
if (!string.IsNullOrEmpty(qry))
{
UpdateFilter();
FICount.Content = DataGrid1.Items.Count;
}
public string DeInjectText(text)
{
// Do stuff here to remove SQL injection danger from text
return text;
}
Комментарии:
1. Спасибо вам за это! У меня появилась идея, однако DeInjectText, похоже, выдает ошибку, хотя выглядит правильно. Мне просто интересно, что я делаю не так
2. @hatman нужна дополнительная информация о вашей ошибке DeInjectText. Имейте в виду, что мой пример функции ничего не дает — вам нужно решить, что имеет смысл для вас, и, возможно, это более глобальная функция в вашем проекте. Вы захотите отфильтровать различные комбинации символов, такие как начальные комментарии, конечные кавычки и т.д. Google для получения дополнительной информации