分配给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("' ");
这里不需要使用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"