Quel est le point de DBNull?

Dans .NET il y a le null de référence, qui est utilisé partout pour indiquer qu'un objet de référence est vide, et puis il y a la DBNull, qui est utilisé par les pilotes de base de données (et quelques autres) pour désigner... à peu près la même chose. Naturellement, cela crée beaucoup de confusion et de routines de conversion doivent être sortis, etc.

Alors, pourquoi l'original .NET les auteurs décident de faire cela? Pour moi, il n'a pas de sens. Leur documentation n'a pas de sens, soit:

La DBNull classe représente une inexistant valeur. Dans une base de données, par exemple, une colonne dans une ligne d'une table peut ne pas contenir toutes sortes de données que ce soit. Qui est, la colonne est considérée ne pas exister du tout, au lieu de se contenter de ne pas avoir une valeur. Un DBNull objet représente l'inexistante de la colonne. En outre, l'interopérabilité COM utilise le DBNull classe de distinguer entre une VT_NULL variante, ce qui indique une inexistant valeur, et un VT_EMPTY variante, ce qui indique une valeur quelconque.

C'est quoi cette merde sur une colonne "n'existant pas"? Il existe une colonne, il n'a tout simplement pas avoir une valeur pour la ligne particulière. Si elle n'existait pas, j'aurais une exception en essayant d'accéder à la cellule spécifique, pas une DBNull! Je peux comprendre la nécessité de faire la distinction entre VT_NULL et VT_EMPTY, mais alors pourquoi ne pas faire un COMEmpty classe à la place? Ce serait beaucoup plus lisible ajustement dans l'ensemble .NET framework.

Suis-je raté quelque chose? Quelqu'un peut-il éclairer pourquoi DBNull a été inventé, et les problèmes qu'il aide à résoudre?

  • Juste un autre point de données... DBI (Interface de Base de données) module dans le langage Perl n'ont pas un concept de DbNull. Lorsqu'une valeur est NULL dans la base de données, DBI représente comme le Perl "undef" qui est le Perl équivalent de "null" en C#. Si Perl a pris la position d'un "DbNull" concept n'est pas nécessaire et je n'ai pas entendu de tous les programmeurs Perl souhaitant qu'ils avaient DbNull.
  • Je suis avec vous, @JoelFan - je ne vois pas de réel intérêt dans il soit
  • Outre les réponses ci-dessous, le commentaire ci-dessous par @thomas-levesque est très important: DBNull est antérieure à l'introduction dans le .NET framework de véritables types nullables. Tant leur comportement est légèrement différent, donc DBNull avait de séjour (à mon grand regret, mais c'est une autre histoire).
  • J'aime la question, mais je dois dire que la communauté est incohérent. Beaucoup de questions sur "pourquoi est-il de cette façon?" obtenir fermés que "pas question", surtout si la personne se permet d'expliquer pourquoi quelque chose semble n'avoir aucun sens. (J'ai essayé de demander ou se plaindre du manque de soutien approprié pour les types abstraits en exposant des services WCF en tant que services web et me suis tourné vers le bas tout de suite!)
InformationsquelleAutor Vilx- | 2010-12-20