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

时间:2014-07-23 18:33:11

标签: c# sql

我有六行参数,如下所示:

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

等等。

有没有办法在不直接插入cmd.CommandText?

的情况下压缩这一点

编辑:我想我可以使用一个很好的老式数组。我决定坚持这一点。

4 个答案:

答案 0 :(得分:8)

据我所知,你的代码在行计数方面是最紧凑的,但你可以使用带有对象初始值设定语法的List<SqlParameter>只有一行以分号结束来构建你的参数list,然后将该列表作为AddRange方法所期望的参数数组

传递
 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上的这篇文章中How data access code affects database perfomance很好地解释了为什么出于性能原因应该避免使用AddWithValue方法。
简而言之,使用AddWithValue可能是Sql Server Optimizer的问题,因为string类型的参数的传递大小等于字符串的当前长度。但这会强制Sql Server Optimizer放弃为之前相同的调用创建的查询计划,但使用不同长度的字符串。
最好调用SqlParameter构造函数来指定参数的类型和大小,而不必担心调用的compress the size

答案 1 :(得分:5)

我从字面上理解了这个问题:“......在一个声明中”:)

史蒂夫代码很不错但是使用最规范的SqlParameter构造函数和隐式数组声明可以简化它:

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

答案 2 :(得分:2)

仅仅为了论证,使用你给出的代码示例,其中存储的proc变量字面上命名为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个值,这样的循环可能会派上用场,虽然我不常见。你可以使用2个数组作为变量名,1个作为值,只要索引匹配,那么这将有效:

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]);
}

答案 3 :(得分:1)

我认为这会很好地读作这样的单线:

用法:

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

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

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);
    }
}

这个答案的灵感来自于Key value pairs in C# Params

Bryan Watts的接受回答