Как искать пользовательский ввод в столбце DataTable
В настоящее время я ищу, как показано ниже.
DataRow[] row = dataTable.Select("FieldName='"+ userInput + "'");
Проблема здесь в том, что когда пользователь вводит одинарную кавычку (')
выкидывает ошибку.
Я могу легко исправить это
DataRow[] row = dataTable.Select("FieldName='" + userInput.Replace("'","''") + "'");
Я беспокоюсь, что другие пользовательские входы могут вызвать проблемы?
3 ответа
@Ismail: было бы неплохо, если бы мы проверяли вводимые пользователем данные перед их использованием в запросах переднего плана или внутренних запросов.
Так что я думаю, что в вашем сценарии у вас должна быть такая функция...
if(ValidateInput(userInput))
{
DataRow[] rows = dataTable.Select("FieldName='"+ userInput + "'");
}
и в проверке вы можете сделать любую проверку. сейчас вы хотите только проверить, но в будущем вам, возможно, придется проверить что-то еще.
и, в зависимости от ваших потребностей, вы можете проверить тип возвращаемой функции проверки, если вы хотите изменить входные данные, то измените и верните эти данные, просто вернув bool.
Если вы хотите использовать DataTable.Select(фильтр) для фильтра данных, вам придется форматировать / игнорировать или заменять специальный символ из оператора фильтра, и для этого вам нужно будет написать больше кода. Если вы не хотите паниковать из-за специального символа, вы можете использовать LINQ, например
DataTable dataTable = new DataTable();
DataColumn dc = new DataColumn("FieldName");
dataTable.Columns.Add(dc);
DataRow dr = dataTable.NewRow();
dr[0] = "D'sulja";
dataTable.Rows.Add(dr);
string input = "D'sulja";
var result = from item in dataTable.AsEnumerable()
where item.Field<string>("FieldName") == input select item;
В этом случае я думаю, что единственная кавычка - это единственный символ, о котором вам нужно беспокоиться, поскольку он используется для разделения строковых значений. Дополнительные сведения о синтаксисе выражений см. В записи MSDN для DataColumn.Expression (для создания выражения фильтра используются те же правила, что и для свойства DataColumn.Expression).
Вы не указываете, какую версию C# вы используете, но с помощью LINQ вы можете сделать это:
var rows = table.AsEnumerable()
.Where(r => r.Field<string>("Name") == "O'Hare")
.Select(r => r)
.ToArray();
Одним из компромиссов является то, что вам также нужно проверить RowState, если у вас есть какие-либо удаленные строки в DataTable, но он предоставляет другую опцию.