如何在一条语句中为SQL命令添加多个参数

本文关键字:添加 命令 参数 SQL 一条 语句 | 更新日期: 2023-09-27 18:14:21

我有六行参数,像这样:

    cmd.Parameters.AddWithValue("@variable1", myvalue1);
    cmd.Parameters.AddWithValue("@variable2", myvalue2);
    cmd.Parameters.AddWithValue("@variable3", myvalue3);

等等

有没有办法压缩这一点,而不直接插入在cmd.CommandText?

编辑:我想我可以用一个老式的数组。不过我还是决定继续用这个

如何在一条语句中为SQL命令添加多个参数

据我所知,您的代码在行数方面可能是最紧凑的,但是您可以使用List<SqlParameter>和对象初始化器语法,只有一行以分号结束来构建参数列表,然后将该列表作为adrange方法

期望的参数数组传递。
 List<SqlParameter> prm = new List<SqlParameter>()
 {
     new SqlParameter("@variable1", SqlDbType.Int) {Value = myValue1},
     new SqlParameter("@variable2", SqlDbType.NVarChar) {Value = myValue2},
     new SqlParameter("@variable3", SqlDbType.DateTime) {Value = myValue3},
 };
 cmd.Parameters.AddRange(prm.ToArray());

注意,使用这种方法需要正确定义参数的数据类型。在我的示例中,我使用了一些任意类型来显示正确的语法

有点跑题了,我认为在这种情况下指出AddWithValue是很有趣的,当你想要获得最好的性能时,不应该考虑。

在MSDN的这篇文章中,数据访问代码如何影响数据库性能很好地解释了为什么出于性能原因应该避免使用AddWithValue方法。
简而言之,使用AddWithValue对于Sql Server Optimizer来说可能是一个问题,因为传递string类型的参数的大小等于字符串的当前长度。但是这将迫使Sql Server Optimizer放弃为之前相同的调用创建的查询计划,但使用不同长度的字符串。
最好调用SqlParameter构造函数,指定参数的类型和大小,不要担心如何调用compress the size

我从字面上理解了这个问题:"…:)

Steve的代码很好,但是可以使用最规范的SqlParameter构造函数和隐式数组声明来简化它:

cmd.Parameters.AddRange(new []
    {
        new SqlParameter("@variable1", myValue1),
        new SqlParameter("@variable2", myValue2),
        new SqlParameter("@variable3", myValue3),
    });

我认为像这样一行字读起来会很好:

用法:

// One liner to create and set SqlCommand parameters
cmd.SetParameters(Parameter("@variable1", myvalue1), Parameter("@variable2", myvalue2), Parameter("@variable3", myvalue3));

要支持单行,您需要创建一个函数,将Sql Parameter包装为语义包(类似于元组),如下所示:

public SqlParameter Parameter(string name, object value)
{
    return new SqlParameter(name, value);
}

创建一个带有扩展方法的静态类,为我们提供我们正在寻找的语法糖。注意params关键字的使用,它允许上面的多个参数调用SetParameters。

public static class SqlDataUtils
{
    public static void SetParameters(this SqlCommand command, params SqlParameter[] parameters)
    {
        command.Parameters.AddRange(parameters);
    }
}

这个答案的灵感来自于Bryan Watts对c#参数中键值对的公认答案

只是为了方便讨论,使用您给出的代码示例,其中存储的过程变量被字面命名为variabe1, variable2等…你可以这样做:

string[] myValues = new string[] { "myvalue1", "myvalue2", "myvalue3", "myvalue4", "myvalue5", "myvalue6" };
for (int i = 0; i < 6; i++) { cmd.Parameters.AddWithValue("@variable" + (i + 1),myValues[i]); }

2行丑陋的代码…LOL

如果你有25 - 50个值,像这样的循环可能会派上用场,尽管我不经常看到这种情况。你可以使用两个数组一个用于变量名另一个用于值,只要索引匹配,就可以这样做:
string[] myVarNames = new string[] { "variable1", "variable2", "variableThree", "variable4our", "variableFIVE", "variableSIX" };
string[] myValues = new string[] { "myvalue1", "myvalue2", "myvalue3", "myvalue4", "myvalue5", "myvalue6" };
for (int i = 0; i < 6; i++)
{
    cmd.Parameters.AddWithValue("@" + myVarNames[i], myValues[i]);
}