stringbuilder.tostring() 分配给 datatable.select() 并不总是有效,有什么想法吗?

stringbuilder.tostring() assigned to datatable.select() not always working, any ideas why?

DataRow[] dr = dataTable.select(stringbuilder.ToString());

这就是 selects 的代码。如果参数是string类型的话,就全是fine.But 如果恰好像上面这样,好像不是一直有效。直到昨天一切都很好,今天代码被破解了。

知道是什么原因造成的吗?我们选择了 stringbuilder,因为我们通过连接字符串

来构建 select 语句

select 语句的构造通过一个开关发生,我们比较相等性(我们正在应用过滤器)的示例如下:

select.AppendLine(filter.Column); 
select.AppendLine(" "); 
select.AppendLine(ComparisonOperatorsEnum.Equal); 
select.AppendLine(" '"); 
select.AppendLine(filter.Value.ToString()); 
select.AppendLine("' ");

当你在 stringBuilder 中有单引号时,你应该使用 " \' "
所以修改stringBuilder的生成,让结果的值变成"COMPLETION_NAME\r\n \r\n=\r\n \'\r\nW890-CSG\r\n\' \r\n"

我建议将 AppendLine 更改为 Append。此外,您还会面临 SQL 注入攻击。我建议

select.Append(Filter.Value.ToString().Replace("'", "\"");

这里不需要使用 AppendLine,您可以使用 AppendFormat 来构建您的 Select 过滤器

select.AppendFormat("{0} {1} '{2}'", filter.Column,
                                    ComparisonOperatorsEnum.Equal, 
                                    filter.Value.ToString());

使用 AppendLine 自动回车 return/line 提要添加到附加字符串的末尾。因此,您的过滤器值包含两个回车符 returns 和可能不在您要搜索的字符串中的换行符。因此匹配失败,什么都没有 returns.

使用 AppendFormat 您可以更好地控制 select 过滤器的格式,尽管它可能比一系列追加要慢。但是,应该根据代码的清晰度来评估这种较低的性能。