目前我正在搜索如下。
DataRow[] rows = dataTable.Select("FieldName='"+ userInput + "'");
这里的问题是,每当用户提供带单引号的输入时(')
,它都会引发错误。
我可以很容易地纠正它
DataRow[] rows = dataTable.Select("FieldName='" + userInput.Replace("'","''") + "'");
我担心其他用户输入可能会导致问题?
目前我正在搜索如下。
DataRow[] rows = dataTable.Select("FieldName='"+ userInput + "'");
这里的问题是,每当用户提供带单引号的输入时(')
,它都会引发错误。
我可以很容易地纠正它
DataRow[] rows = dataTable.Select("FieldName='" + userInput.Replace("'","''") + "'");
我担心其他用户输入可能会导致问题?
这是尊敬的Jon Skeet 先生的确切答案。
@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;
在这种情况下,我认为单引号是您唯一需要担心的字符,因为它用于分隔字符串值。有关表达式语法的详细信息,请参阅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,但它确实提供了另一种选择。