Question

Nous avons notre propre ORM que nous utilisons ici et fournissons des wrappers fortement typés pour toutes nos tables de base de données.Nous autorisons également l'exécution de SQL ad hoc faiblement typé, mais ces requêtes passent toujours par la même classe pour extraire les valeurs d'un lecteur de données.

En peaufinant cette classe pour qu'elle fonctionne avec Oracle, nous sommes tombés sur une question intéressante.Est-il préférable d'utiliser DBNull.Value ou null ?Y a-t-il des avantages à utiliser DBNull.Value ?Il semble plus "correct" d'utiliser null, puisque nous nous sommes séparés du monde DB, mais il y a des implications (vous ne pouvez pas aveuglément ToString() lorsqu'une valeur est nulle par exemple), c'est donc certainement quelque chose sur lequel nous devons prendre une décision consciente.

Était-ce utile?

La solution

Je trouve préférable d'utiliser null plutôt que DB null.

La raison est que, comme vous l'avez dit, vous vous séparez du monde de la base de données.

Il est généralement recommandé de vérifier les types de référence pour s'assurer qu'ils ne sont pas nuls de toute façon.Vous allez vérifier null pour des choses autres que les données de base de données, et je trouve qu'il est préférable de maintenir la cohérence dans tout le système et d'utiliser null, pas DBNull.

À long terme, sur le plan architectural, je trouve que c'est la meilleure solution.

Autres conseils

Si vous avez écrit votre propre ORM, je dirais simplement d'utiliser null, car vous pouvez l'utiliser comme vous le souhaitez.Je crois que DBNull a été utilisé à l'origine uniquement pour contourner le fait que les types de valeur (int, DateTime, etc.) ne pouvaient pas être null, donc plutôt que de renvoyer une valeur comme zéro ou DateTime.Min, ce qui impliquer un null (mauvais, mauvais), ils ont créé DBNull pour l'indiquer.Peut-être qu’il y avait plus, mais j’ai toujours pensé que c’était la raison.Cependant, maintenant que nous disposons de types nullables en C# 3.0, DBNull n’est plus nécessaire.En fait, LINQ to SQL utilise simplement null partout.Aucun problème du tout.Embrassez l'avenir...utilisez null.;-)

D'après l'expérience que j'ai eue, les DataTables et TableAdapters .NET fonctionnent mieux avec DBNull.Il ouvre également quelques méthodes spéciales lorsqu'il est fortement typé, telles que DataRow.IsFirstNameNull lorsqu'il est en place.

J'aimerais pouvoir vous donner une meilleure réponse technique que cela, mais pour moi, l'essentiel est d'utiliser DBNull lorsque vous travaillez avec des objets liés à la base de données, puis d'utiliser un null "standard" lorsque je traite des objets et du code associé à .NET.

Utiliser DBNull.
Nous avons rencontré des problèmes lors de l'utilisation de null.
Si je me souviens bien, vous ne pouvez pas INSÉRER une valeur nulle dans un champ, uniquement DBNull.
Cela pourrait être uniquement lié à Oracle, désolé, je ne connais plus les détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top