带有动态参数数组的 StringBuilder AppendFormat

问题描述 投票:0回答:2

我正在使用 StringBuilder 动态构建 SQL 语句。标准由用户定义,没有限制。

字符串格式没有问题,生成正常。

假设用户定义了 3 个标准。

动态格式化的字符串是:“SELECT * FROM Table WHERE (Field1 = '{0}' OR Field1 = '{1}') AND (Field2 = '{2}')”

目前我有:

StringBuilder sb = new StringBuilder();
sb.AppendFormat("SELECT * FROM Table WHERE (Field1 = '{0}' OR Field1 = '{1}') AND (Field2 = '{2}')", p[0], p[1], p[2]);

如何用循环添加参数数组?

例如:

for (int i = 0; i < p.Count; i++)
{
    sb.AppendFormat("SELECT * FROM Table WHERE (Field1 = '{0}' OR Field1 = '{1}') AND (Field2 = '{2}')", p[i]);
}

谢谢。

c# stringbuilder asp.net-core-6.0
2个回答
0
投票

从技术上讲,您可以使用 string.Join

p
集合加入到
string
中,以
", "
作为分隔符:

sb.Append($"Field1 in ({string.Join(", ", p)})");

sb.AppendFormat("Field1 in ({0})", string.Join(", ", p));

我也更改了 SQL 语法:

field1 in (p1, p2, ..., pn)
而不是
field1 = p1 or field1 = p2 or ... or field1 = pn
.

但是,在构建 SQL 而不是使用参数(或绑定变量)时要小心:SQL 注入 可能是一个真正的问题。


0
投票

尽管我没有使用过 string.join,但基于 Dimitry 使用单个占位符的想法,我修改了代码以将条件连接成一个字符串,如下所示。

strWhere 是根据条件动态生成的字符串。

strWhere = "(Field1 = value1 OR Field1 = value2) AND (Field2 = Value3)"
StringBuilder sqlRaw = new StringBuilder();
sqlRaw.AppendFormat("SELECT * FROM Fichas WHERE {0}", strWhere);

非常感谢 Dimitry 的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.