我有六行参数,如下所示:
cmd.Parameters.AddWithValue("@variable1", myvalue1);
cmd.Parameters.AddWithValue("@variable2", myvalue2);
cmd.Parameters.AddWithValue("@variable3", myvalue3);
等等。
有没有办法在不直接插入cmd.CommandText?
的情况下压缩这一点编辑:我想我可以使用一个很好的老式数组。我决定坚持这一点。
答案 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的接受回答