目前我正在搜索如下。
DataRow [] rows = dataTable.Select( “字段名='” + userInput +“'”);
这里的问题是,只要用户提供带有单引号(')
的输入,就会抛出错误。
我可以通过
轻松纠正它DataRow [] rows = dataTable.Select(“FieldName ='”+ userInput.Replace(“'”,“''”)+“'”);
我担心其他用户输入可能会导致什么问题?
答案 0 :(得分:2)
Here是尊敬的Mr. Jon Skeet的确切答案。
答案 1 :(得分:1)
@Ismail:如果我们在前端查询或后端查询中使用之前验证用户输入,那将是一个好习惯。
所以我认为在你的场景中你必须具有像...这样的功能。
if(ValidateInput(userInput))
{
DataRow[] rows = dataTable.Select("FieldName='"+ userInput + "'");
}
在验证中你可以做任何检查。现在你只想检查'但将来,你可能需要检查其他东西。
根据你的需要你可以修改返回类型的验证函数,如果你想修改输入数据然后修改并返回其他只返回bool。
如果你想使用DataTable.Select(filter)进行数据过滤,那么你必须格式化/忽略或替换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;
答案 2 :(得分: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,但它确实提供了另一个选项。