Question

LET dire de J'ai une classe

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

Maintenant dans ma couche de données, je suis en train de le code d'écriture qui va créer une instance de IDataCommand et ensemble fooid que sur des paramètres de commande quelque chose comme ceci

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 vous remarquez la ligne de code - param.value = (f.FooId> 0) f.id: (objet) DBNull.Value; . Ma question est exactement dans ce domaine. Si j'ai trop de paramètres à fournir. Il semble un peu mal quand je vérifie la valeur comme celui-ci sur tous les paramètres. La question est ici quelle est la meilleure façon de faire ce genre de chose? Qui devrait faire DL ou BL? Si BL, alors faut-il attribuer la valeur DBNull il? Est-il un autre moyen standard de faire cela?

Était-ce utile?

La solution

Pourquoi ne pas essayer une méthode d'extension générique?

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

Utilisez comme suit:

param.SetValue(f.id);

Autres conseils

La solution la plus complète est de ne pas faire vous-même. Il y a beaucoup de cadres là-bas qui vous aideront ici -. Jeter un oeil à NHibernate ou Entity Framework, par exemple,

Si vous avez vraiment besoin de le faire manuellement alors vous pouvez factoriser les contrôles dans les méthodes réutilisables. Quelque chose comme ceci:

  public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue) 
  {
    // Add the parameter and perform the checks here.
  } 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top