Как искать пользовательский ввод в столбце DataTable

В настоящее время я ищу, как показано ниже.

DataRow[] row = dataTable.Select("FieldName='"+ userInput + "'");

Проблема здесь в том, что когда пользователь вводит одинарную кавычку (')выкидывает ошибку.

Я могу легко исправить это

DataRow[] row = dataTable.Select("FieldName='" + userInput.Replace("'","''") + "'");

Я беспокоюсь, что другие пользовательские входы могут вызвать проблемы?

3 ответа

Решение

Вот точный ответ от благородного Jon Skeet.

@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, но он предоставляет другую опцию.

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