Pregunta

Vamos a decir que tengo una clase

public class foo { public string FooId { get; set; } }

Ahora, en mi capa de datos, que estoy tratando de escribir código que va a crear una instancia de IDataCommand y FooId conjunto como el de los parámetros de comando algo como esto

public void save(foo f, IDbConnection conn)
{ 
    IDataCommand cmd = conn.CreateCommand(); 
    cmd.CommandName = "SP_SAVE_INFO" ; 
    IDataDbParameter param = cmd.CreateParameter(); 
    param.name = "@fooId"; 
    param.value=(f.id>0)?f.id:(object)DbNull.Value;
    cmd.parameters.add(param);
    cmd.ExecuteNonQuery();
}

Si se observa la línea de código - param.value = (f.FooId> 0) f.id:? (Objeto) DBNull.Value; . Mi pregunta es exactamente en esta zona. Si tengo demasiados parámetros que se preste. Se ve un poco mal cuando compruebo para el valor de este tipo en todos los parámetros. Pregunta aquí es ¿cuál es la mejor manera de hacer este tipo de cosas? ¿Quién debe hacer eso DL o BL? Si BL, entonces debería asignar DBNull Valor allí? ¿Hay alguna otra forma estándar de hacer esto?

¿Fue útil?

Solución

¿Por qué no probar un método de extensión genérico?

public static class IDataDbParameterExtensions
{
    public static void SetValue<T>(this IDataDbParameter parameter, T value)
    {
        if(value == default(T)) // for structs (ValueTypes) like Int, default(T) will be 0 and for classes (RefTypes), it will be null.
        {
            parameter.Value = DBNull.Value;
        }
        else
        {
            parameter.Value = value;
        }
    }
}

Se usa como siguiente:

param.SetValue(f.id);

Otros consejos

La solución más completa no es hacerlo usted mismo. Hay muchos marcos por ahí que le ayudará a aquí -. Echar un vistazo a NHibernate o Entity Framework, por ejemplo,

Si realmente necesita hacer esto manualmente, entonces podría refactorizar los controles en los métodos reutilizables. Algo como esto:

  public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue) 
  {
    // Add the parameter and perform the checks here.
  } 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top