Domanda

dire Let Ho una classe

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

Ora nel mio livello di Data, sto cercando di scrivere il codice che creerà un'istanza di IDataCommand e set FooId come uno dei parametri di comando qualcosa di simile

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

Se si nota riga di codice - param.value = (f.FooId> 0) f.id:? (Oggetto) DBNull.Value; . La mia domanda è proprio in questa zona. Se ho troppi parametri che devono essere fornite. Sembra tipo di male quando posso controllare per il valore come questo su tutti i parametri. Questione è qual è il modo migliore per fare questo genere di cose? Chi dovrebbe farlo DL o BL? Se BL, allora dovrebbe assegnare DBNull Valore lì? C'è un altro modo standard di fare questo?

È stato utile?

Soluzione

Perché non provare un metodo di estensione generica?

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

utilizzarlo come segue:

param.SetValue(f.id);

Altri suggerimenti

La soluzione più completa è di non farlo da soli. Ci sono molti quadri là fuori che vi aiuterà a qui -. Dare un'occhiata a NHibernate o Entity Framework per esempio

Se avete veramente bisogno di farlo manualmente, allora si potrebbe refactoring i controlli sui metodi riutilizzabili. Qualcosa di simile a questo:

  public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue) 
  {
    // Add the parameter and perform the checks here.
  } 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top