分配给datatable.select()的Stringbuilder.tostring()并不总是工作,知道为什么吗?

本文关键字:工作 为什么 select datatable Stringbuilder 分配 tostring | 更新日期: 2023-09-27 18:09:36

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

这就是select代码的样子。如果参数是字符串类型,则一切正常。但如果它碰巧像上面那样,它似乎并不总是有效。直到昨天一切都很好,今天代码被打破了。

你知道是什么原因导致的吗?我们使用stringbuilder,因为我们通过连接字符串来构造select语句

select语句的构造是通过一个开关实现的,下面是一个比较相等性的例子(我们正在应用过滤器):

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

分配给datatable.select()的Stringbuilder.tostring()并不总是工作,知道为什么吗?

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

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

使用AppendLine,在附加字符串的末尾添加自动回车/换行。所以你的过滤值包含两个回车和新行,它们可能不在你正在搜索的字符串中。因此,匹配失败并且没有返回任何内容。

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

我建议将AppendLine改为Append。此外,您还将自己置于SQL注入攻击之下。我建议

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

当你在stringBuilder中有单引号时,你应该使用"'' "
因此,修改stringBuilder的生成,使值将导致"COMPLETION_NAME'r'n 'r'n='r'n '''r'nW890-CSG'r'n'' 'r'n"

相关文章: