1

目前我正在搜索如下。

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

这里的问题是,每当用户提供带单引号的输入时('),它都会引发错误。

我可以很容易地纠正它

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

我担心其他用户输入可能会导致问题?

4

3 回答 3

2

是尊敬的Jon Skeet 先生的确切答案。

于 2010-12-27T09:05:52.507 回答
1

@Ismail:如果我们在前端查询或后端查询中使用用户输入之前验证用户输入,这将是一个好习惯。

所以我认为在你的场景中你必须有这样的功能......

if(ValidateInput(userInput))
{
  DataRow[] rows = dataTable.Select("FieldName='"+ userInput + "'");
}

在验证中,您可以进行任何检查。现在您只想检查 ' 但将来,您可能需要检查其他内容。

并且根据您的需要,您可以检查验证函数的返回类型,如果要修改输入数据,则修改并返回,否则只返回 bool。

如果您想使用 DataTable.Select(filter) 进行数据过滤,那么您必须格式化/忽略或替换过滤器语句中的特殊字符,为此您必须编写更多代码。如果您不想对特殊字符感到恐慌,那么您可以使用 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;
于 2010-12-27T05:29:07.937 回答
0

在这种情况下,我认为单引号是您唯一需要担心的字符,因为它用于分隔字符串值。有关表达式语法的详细信息,请参阅DataColumn.Expression的 MSDN 条目(创建筛选表达式使用与 DataColumn.Expression 属性相同的规则)。

您没有指明您使用的是哪个版本的 C#,但使用 LINQ,您可以这样做:

var rows = table.AsEnumerable()
                .Where(r => r.Field<string>("Name") == "O'Hare")
                .Select(r => r)
                .ToArray();

一个权衡是,如果 DataTable 中有任何已删除的行,您还需要检查 RowState,但它确实提供了另一种选择。

于 2010-12-27T06:29:05.360 回答