Inserindo um valor DBNull em um banco de dados
On Fevereiro 9, 2021 by admin Eu tenho um código que funciona muito bem. Só preciso de algumas de suas opiniões sobre como escrevê-lo melhor com menos linhas de código. Quero usar um operador ternário, mas não consegui fazer funcionar, então fiz um if else
em vez disso.
Basicamente, quero inserir um preço no meu banco de dados. A coluna de preço é um decimal anulável. Mesmo no meu código C #, também é um decimal anulável.
if (items.Price == null) { SqlParameter[] p = { new SqlParameter("@purchaseorder", items.PurchaseOrderItems), new SqlParameter("@modelnumber", items.ModelNumber), new SqlParameter("@quantity", items.Quantity), new SqlParameter("@Price", DBNull.Value), new SqlParameter("@Description", items.Description), new SqlParameter("@OrderNumber", items.OrderNumber), new SqlParameter("@Unit", items.Unit) }; i = Dal.ExecuteNonQuery(sql,p); } else { SqlParameter[] p = { new SqlParameter("@purchaseorder", items.PurchaseOrderItems), new SqlParameter("@modelnumber", items.ModelNumber), new SqlParameter("@quantity", items.Quantity), new SqlParameter("@Price", items.Price), new SqlParameter("@Description", items.Description), new SqlParameter("@OrderNumber", items.OrderNumber), new SqlParameter("@Unit", items.Unit) }; i = Dal.ExecuteNonQuery(sql,p); } return i;
Isso pode ser escrito sem o else
bloquear?
Comentários
- Por que não tornar a vida mais fácil e usar um ORM? " se você está escrevendo código ADO.Net manualmente, está roubando de seu empregador ou cliente. "
- @BCdotWEB Como alguns programadores comentaram nessa postagem, se as pessoas seguissem esse conselho, não ' t temos todos aqueles ORMs bonitos por aí. Às vezes, fazer da maneira antiga e artesanal é a melhor maneira de aprender – aprendemos sobre as dificuldades e descobrimos quais problemas precisamos resolver.
Resposta
Tudo que você precisa fazer é usar o ?:
(operador ternário ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Como alternativa, você pode escrever uma extensão para ele:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
e use-o em seu lugar:
new SqlParameter("@Price", items.PriceOrDefault())
Acontece que o Price
é um decimal?
, então você pode considerar usar a propriedade HasValue
e trocar os valores:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Acho que parece melhor do que a verificação de nulos.
Comentários
- Desculpe , mas eu tenho uma linha embaralhada embaixo. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Basta enviar para
object
. Eu editei os exemplos.SqlParameter
espera assim mesmo. - Isso funciona .. Obrigado. Vou envolver isso no método de extensão. Obrigado
- Se você escolher o método auxiliar, ' prefiro o mais geral
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
Resposta
A maneira mais concisa e declarativa de escrever isso é usar C # “s ??
. Sua linha se torna:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
A expressão aqui retornará o valor não nulo do operando esquerdo (items.Price
) ou retorne o operando à direita.
Se você não adivinhou, o operador ??
é basicamente um açúcar sintático para if operl != null ? operl : operr
.
Comentários
- legal, na verdade eu conheço este também mas não ' achei que funcionaria assim com um anulável: -]
- Usar coalescência nula é definitivamente a opção mais limpa.
Resposta
Isso é questão de gosto pessoal, mas se você for ao e xtension method route sugerido por t3chb0t , considero torná-lo genérico para que você possa reutilizá-lo em qualquer futuro Nullable
tipos que você pode usar e não acaba com um monte de funções de aparência muito semelhantes para campos diferentes. Algo assim:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Permitiria:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
etc.
Comentários
- uau, acredito que ' nunca tive a ideia de usar o anulável
?
em umT
+struct
; -)
Resposta
Você já deu uma olhada no System.Data .SqlTypes namespace – particularmente SqlDecimal ?
Com base em algumas das outras respostas, você pode usar SqlDecimal
e o operador ??
da seguinte forma:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Deixe uma resposta