Skip to content

C# 向SqlCommand添加参数列表

L edited this page Mar 12, 2023 · 3 revisions

在我们写SQL时,经常会遇到INNOT IN这样的查询条件,这时后面的条件需要一个参数列表。 我们期待可以根据数据列表[1,3,5],动态生成多个参数,即@Parameter1=1,@Parameter2=3,@Parameter3=5。 我们可以写一个扩展方法实现它:

public static class SqlCommandExtensions
{
    public static void AddArrayParameters<T>(this SqlCommand cmd, string name, IEnumerable<T> values)
    {
        name = name.StartsWith("@") ? name : "@" + name;
        var names = string.Join(", ", values.Select((value, i) =>
        {
            var paramName = name + i;
            cmd.Parameters.AddWithValue(paramName, value);
            return paramName;
        }));
        cmd.CommandText = cmd.CommandText.Replace(name, names);
    }
}

如何使用它:

var ageList = new List<int> { 1, 3, 5, 7, 9, 11 };
var cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM MyTable WHERE Age IN (@Age)";
cmd.AddArrayParameters("Age", ageList);

//查看结果
foreach (SqlParameter parameter in cmd.Parameters)
{
    Console.WriteLine($"{parameter.ParameterName},{parameter.Value}");
}
Console.WriteLine(cmd.CommandText);

执行``后,得到SQL:

SELECT * FROM MyTable WHERE Age IN (@Age0, @Age1, @Age2, @Age3, @Age4, @Age5)

并且Parameters添加了@Age0, @Age1, @Age2, @Age3, @Age4, @Age5共6个参数。

示例代码

SqlCommandExtensions
AddParameterArrayToSqlCommandDemo

参考资料

Pass Array Parameter in SqlCommand

Clone this wiki locally