2012-08-02 13 views
5

Estoy intentando crear una matriz de SqlParameters dbTyped y de tamaño. Esto funciona bien pero da como resultado el cambio de código en ambos lugares si necesito otra columna.Matriz de SqlParameters de tamaño/tipado

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; 

¿Cuál es la mejor forma de hacerlo?

Respuesta

11

Usted puede utilizar object initializer expresiones:

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

También puede crear una lista de la misma manera, que a menudo se prefiere:

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

O incluso podría escribir un método de extensión en SqlParameter:

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

luego usarlo como esto:

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

Exactamente lo que estaba buscando. Exploré la opción 3 pero no me gustó lo que se me ocurrió. ¡Gracias! –

+0

@Jon Skeet Encontré tu publicación muy útil, pero actualmente estoy trabajando en Framework 2.0. Por lo tanto, muestra un error como "Feature Object Initializer no se puede usar porque no es parte de la especificación del lenguaje ISO-2 C#. Lo siento, ahora no es posible actualizar el proyecto. Entonces, ¿hay alguna manera eficiente de hacerlo? –

+0

@RahulNikate: El hecho de que use .NET 2.0 no significa que no pueda usar las funciones más nuevas de C#. Por ejemplo, podría usar Visual Studio 2013 y seguir enfocando .NET 2.0. Si se limita a C# 2.0, encontrará una gran cantidad de código en las publicaciones de Stack Overflow no funciona para usted, y no es práctico proporcionar alternativas en todas partes. –

-2

puede agregar el valor de nuevo de esta manera:

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

No, no puede - porque entonces el valor de esa expresión es 'to.FirstName', no' SqlParameter'. –

+0

Bueno, lo uso y funciona ... – Stig

+1

¿En una expresión de creación de matriz? Es más común tener 'command.AddParameter (...). Value =" foo "' que es completamente diferente. –

0

Puede utilizar el constructor overload que le permite especificar el valor como parámetro.

Por ejemplo:

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

etc... 
0

Una mejor manera? Seguro: dejar que una herramienta de ayuda que, por ejemplo, "pulcro":

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

Esto entonces se encarga de toda la parametrización y la materialización para usted.

Cuestiones relacionadas