Pergunta

Temos nosso próprio ORM que usamos aqui e fornecemos wrappers fortemente tipados para todas as nossas tabelas de banco de dados.Também permitimos a execução de SQL ad-hoc de tipo fraco, mas essas consultas ainda passam pela mesma classe para obter valores de um leitor de dados.

Ao ajustar essa classe para funcionar com Oracle, nos deparamos com uma questão interessante.É melhor usar DBNull.Value ou nulo?Há algum benefício em usar DBNull.Value?Parece mais "correto" usar null, já que nos separamos do mundo do banco de dados, mas há implicações (você não pode simplesmente cegamente ToString() quando um valor é nulo, por exemplo), então é definitivamente algo sobre o qual precisamos tomar uma decisão consciente.

Foi útil?

Solução

Acho melhor usar null, em vez de DB null.

A razão é porque, como você disse, você está se separando do mundo do DB.

Geralmente é uma boa prática verificar os tipos de referência para garantir que eles não sejam nulos de qualquer maneira.Você verificará null para outras coisas além dos dados do banco de dados, e acho que é melhor manter a consistência em todo o sistema e usar null, não DBNull.

No longo prazo, arquitetonicamente, acho que é a melhor solução.

Outras dicas

Se você escreveu seu próprio ORM, eu diria apenas para usar null, já que você pode usá-lo como quiser.Acredito que DBNull foi originalmente usado apenas para contornar o fato de que tipos de valor (int, DateTime, etc.) não poderiam ser nulo, então em vez de retornar algum valor como zero ou DateTime.Min, o que seria implicar um nulo (ruim, ruim), eles criaram DBNull para indicar isso.Talvez houvesse mais do que isso, mas sempre presumi que esse fosse o motivo.No entanto, agora que temos tipos anuláveis ​​no C# 3.0, DBNull não é mais necessário.Na verdade, o LINQ to SQL apenas usa null em todos os lugares.Não há problema algum.Abrace o futuro...use nulo.;-)

Pela experiência que tive, o .NET DataTables e TableAdapters funcionam melhor com DBNull.Ele também abre alguns métodos especiais quando digitado com força, como DataRow.IsFirstNameNull quando instalado.

Eu gostaria de poder lhe dar uma resposta técnica melhor do que essa, mas para mim o resultado final é usar DBNull ao trabalhar com objetos relacionados ao banco de dados e, em seguida, usar um nulo "padrão" quando estiver lidando com objetos e código relacionado ao .NET.

Usar DBNull.
Encontramos alguns tipos de problemas ao usar null.
Se bem me lembro, você não pode INSERIR um valor nulo em um campo, apenas DBNull.
Pode ser apenas relacionado ao Oracle, desculpe, não sei mais os detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top