2012-08-02 27 views
5

我想创建一个dbTyped和大小为SqlParameters的数组。这工作正常,但如果我需要另一列,结果会更改代码这两个地方。大小/类型SqlParameters的数组

SqlParameter[] parameters = { 
            new SqlParameter("@first_name", SqlDbType.VarChar, 50), 
            new SqlParameter("@last_name", SqlDbType.VarChar, 50), 
            new SqlParameter("@middle_name", SqlDbType.VarChar, 50), 
            new SqlParameter("@empid", SqlDbType.Int) 
          }; 
parameters[0].Value = to.FirstName; 
parameters[1].Value = to.LastName; 
parameters[2].Value = to.MiddleName; 
parameters[3].Value = to.EmpId; 

这样做的更好方法是什么?

回答

11

您可以使用object initializer表达式:

SqlParameter[] parameters = 
{  
    new SqlParameter("@first_name", SqlDbType.VarChar, 50) { Value = to.FirstName }, 
    new SqlParameter("@last_name", SqlDbType.VarChar, 50) { Value = to.LastName }, 
    new SqlParameter("@middle_name", SqlDbType.VarChar, 50) { Value = to.MiddleName }, 
    new SqlParameter("@empid", SqlDbType.Int) { Value = to.EmpId } 
}; 

你也可以以同样的方式,这往往是首选创建列表:

List<SqlParameter> parameters = new List<SqlParameter> 
{  
    new SqlParameter("@first_name", SqlDbType.VarChar, 50) { Value = to.FirstName }, 
    new SqlParameter("@last_name", SqlDbType.VarChar, 50) { Value = to.LastName }, 
    new SqlParameter("@middle_name", SqlDbType.VarChar, 50) { Value = to.MiddleName }, 
    new SqlParameter("@empid", SqlDbType.Int) { Value = to.EmpId } 
}; 

或者你甚至可以写一个扩展方法SqlParameter

public static SqlParameter WithValue(this SqlParameter parameter, object value) 
{ 
    parameter.Value = value; 
    return parameter; 
} 

然后使用它是这样的:

List<SqlParameter> parameters = new List<SqlParameter> 
{  
    new SqlParameter("@first_name", SqlDbType.VarChar, 50).WithValue(to.FirstName), 
    new SqlParameter("@last_name", SqlDbType.VarChar, 50).WithValue = to.LastName) 
    new SqlParameter("@middle_name", SqlDbType.VarChar, 50).WithValue(to.MiddleName), 
    new SqlParameter("@empid", SqlDbType.Int).WithValue(to.EmpId) 
}; 
+0

正是我在找的东西。我已经探索了选项3,但不喜欢我提出的。谢谢! – 2012-08-02 18:09:19

+0

@Jon Skeet我发现你的帖子非常有帮助,但是目前我正在使用Framework 2.0。所以它显示错误,如“Feature Object Initializer无法使用,因为它不是ISO-2 C#语言规范的一部分,对不起,现在不可能升级项目,那么是否有任何有效的方法呢? – 2015-01-20 08:49:09

+0

@RahulNikate:仅仅因为你使用的是.NET 2.0并不意味着你不能使用C#的新特性,例如,你可以使用Visual Studio 2013并且仍然以.NET 2.0为目标,如果你只限于C#2.0,你会发现Stack Overflow帖子上的很多代码都不适合你,并且在所有地方都提供替代品是不现实的。 – 2015-01-20 10:01:12

-2

您可以添加值回这样的:

new SqlParameter("@first_name", SqlDbType.VarChar, 50).value = to.FirstName 
+0

不,你不能 - 因为那个表达式的值是'to.FirstName',而不是'SqlParameter'。 – 2012-08-02 18:02:46

+0

那么我使用它,它的工作原理.... – Stig 2012-08-02 18:06:51

+1

在数组创建表达式?使用'command.AddParameter(...).value =“foo”'这更常见,这是完全不同的。 – 2012-08-02 18:09:13

0

可以使用constructor overload,允许你指定的值作为参数。

例如:

SqlParameter[] parameters = { 
           new SqlParameter("@first_name", SqlDbType.VarChar, 50, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Current, to.FirstName), 

etc... 
0

更好的办法?肯定的是:让一个工具帮助你,例如“短小精悍”:

var rows = conn.Query<YourType>(@" your tsql ", 
    new { first_name = to.FirstName, 
      middle_name = to.MiddleName, 
      last_name = to.LastName, 
      empid = to.EmpId }).ToList(); 

这则处理所有的参数设置和物化为您服务。