CLASSES / PARÂMETROS / NULL

01/02/2010

Olá Pessoal. Gostaria que me indicassem uma maneira prática de passar parâmetros para uma classe, considerando que esses parâmetros podem ser nulos. No exemplo abaixo considerando a propriedade _valor (ver destaques em vermelho) o máximo que eu consegui fazer foi colocar a propriedade como nullable (para que ela aceitasse null na atribuibuição), e no procedimento Save testei se o _valor for igual a null e atribui DBNull.Value; Só que assim tem que ser colocado um if para cada propriedade. Qual a melhor maneira de fazer isso, botando praticidade na programação. Grato Sidney
private int _cod_fornecedor;
 private string _num_documento;
 private string _serie_nota;
 private int _sequencial;
 private int _diferenciador;
 private float _valor_base;
 private float _aliquota;
 private float? _valor;
 private float _perc_tributario;
 private float _outros;
 private bool _found; public int CodFornecedor
 {
  get { return _cod_fornecedor; }
  set { _cod_fornecedor = value; }
 }  public string NumDocumento
 {
  get { return _num_documento; }
  set { _num_documento = value; }
 }  public string SerieNota
 {
  get { return _serie_nota; }
  set { _serie_nota = value; }
 }  public int Sequencial
 {
  get { return _sequencial; }
  set { _sequencial = value; }
 }  public int Diferenciador
 {
  get { return _diferenciador; }
  set { _diferenciador = value; }
 }  public float ValorBase
 {
  get { return _valor_base; }
  set { _valor_base = value; }
 }  public float Aliquota
 {
  get { return _aliquota; }
  set { _aliquota = value; }
 }  public float? Valor
 {
  get { return _valor; }
  set { _valor = value; }
 }  public float PercTributario
 {
  get { return _perc_tributario; }
  set { _perc_tributario = value; }
 }  public float Outros
 {
  get { return _outros; }
  set { _outros = value; }
 }  public bool Found
 {
  get { return _found; }
 }
 public bool Save()
 {
  SqlConnection sqlConn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
  SqlCommand cmd = new SqlCommand("usp_SLFEntradasICMSInsert", sqlConn);
  bool result;   cmd.Parameters.Add("@CodFornecedor", SqlDbType.Int).Value = _cod_fornecedor;
  cmd.Parameters.Add("@NumDocumento", SqlDbType.Char, 7).Value = _num_documento;
  cmd.Parameters.Add("@SerieNota", SqlDbType.Char, 2).Value = _serie_nota;
  cmd.Parameters.Add("@Diferenciador", SqlDbType.Int).Value = _diferenciador;
  cmd.Parameters.Add("@ValorBase", SqlDbType.Float).Value = _valor_base;
  cmd.Parameters.Add("@Aliquota", SqlDbType.Float).Value = _aliquota;
if (_valor != null)
   cmd.Parameters.Add("@Valor", SqlDbType.Float).Value = _valor;
  else
   cmd.Parameters.Add("@Valor", SqlDbType.Float).Value = DBNull.Value;
  cmd.Parameters.Add("@PercTributario", SqlDbType.Float).Value = _perc_tributario;
  cmd.Parameters.Add("@Outros", SqlDbType.Float).Value = _outros;   try
  {
   sqlConn.Open();
   cmd.CommandType = CommandType.StoredProcedure;
   result = Convert.ToBoolean(cmd.ExecuteNonQuery());
  }   catch { throw; }   finally
  {
   sqlConn.Close();
   cmd.Dispose();
   sqlConn.Dispose();
  }   return result;
 }
Sidney Mendonça/

Sidney Mendonça/

Curtidas 0

Respostas

Fabio Mans

Fabio Mans

01/02/2010

Sidney não tem muito como fugir da verificação, o que você pode fazer é utilizar um if ternário para ficar mais elegante e criar uma propriedade ValorMinimo, veja como fiz.     public static int ValorMinimo { get { return 0; } }   public bool Save() { SqlConnection sqlConn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]); SqlCommand cmd = new SqlCommand("usp_SLFEntradasICMSInsert", sqlConn); bool result; cmd.Parameters.Add("@CodFornecedor", SqlDbType.Int).Value = _cod_fornecedor; cmd.Parameters.Add("@NumDocumento", SqlDbType.Char, 7).Value = _num_documento; cmd.Parameters.Add("@SerieNota", SqlDbType.Char, 2).Value = _serie_nota; cmd.Parameters.Add("@Diferenciador", SqlDbType.Int).Value = _diferenciador; cmd.Parameters.Add("@ValorBase", SqlDbType.Float).Value = _valor_base; cmd.Parameters.Add("@Aliquota", SqlDbType.Float).Value = _aliquota; cmd.Parameters.Add("@Valor", SqlDbType.Float).Value = _valor ?? ValorMinimo; //Ou   cmd.Parameters.Add("@Valor", SqlDbType.Float).Value = _valor != null ? (object) _valor : DBNull.Value; cmd.Parameters.Add("@PercTributario", SqlDbType.Float).Value = _perc_tributario; cmd.Parameters.Add("@Outros", SqlDbType.Float).Value = _outros;   Mas tem que ser assim, não vejo outra saída. Fabio
GOSTEI 0
Fabio Mans

Fabio Mans

01/02/2010

Posso ajudar em mais alguma coisa?
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

01/02/2010

Está tudo certo. Chamado concluído. Obrigado pela atenção.   Sidney  
GOSTEI 0
POSTAR