2009-05-18 12 views
5

Estoy trabajando con conjuntos de datos fuertemente tipados de .NET y tengo una tabla con una columna int nullable (y una columna con fecha y hora anulable también).Columna Nullable Int en el conjunto de datos

Aparentemente hay un error con el diseñador del conjunto de datos que impide tener columnas que aceptan nulos en estos tipos de datos. El diseñador solo permite "lanzar excepción" como el comportamiento predeterminado para valores nulos. Desafortunadamente, cuando se usa un tipo de datos que admite nulos en la base de datos, un valor nulo ES un valor legítimo pero da como resultado una excepción lanzada al intentar recuperar este valor de una fila de datos.

He visto varias publicaciones de grupos de noticias sobre este problema, pero aún no he visto ninguna solución decente a este problema.

Me encantaría saber cómo otros han solucionado este problema.

Gracias.

+0

ACLARACIÓN: El conjunto de datos está utilizando DBNull (el valor predeterminado), no nulo. – goombaloon

Respuesta

2

DBNull fue básicamente llevó a jugar para hacer frente a los tipos de valor no anulables, pre .NET 2.0. Debido al diseño de ADO.NET, no hay manera de evitar DBNull, a menos que elija un enfoque más directo. DBNull está integrado en el núcleo de ADO.NET, por lo que tendrá que aprender a vivir con eso, si desea seguir usándolo.

Si proporciona sus propios objetos de transporte de datos en lugar de confiar en el espacio de nombres genérico System.Data, puede verificar (mientras lee los resultados con un lector de datos) si el valor es nulo, pero necesitará alguna forma para generar objetos y mapeos fuertemente tipados porque es un trabajo realmente tedioso.

Según tengo entendido, DBNull está integrado en el diseño de ADO.NET y la mejor manera de crear tus aplicaciones si lo usas es fusionar (normalizar) DBNull y null. Básicamente, proporcione su propia clase DbConvert que intercepta DBNull y devuelve una referencia nula real si el valor es DBNull. Este es un requisito mínimo, pero tan pronto como se haga, tendrá menos valores DBNull flotando para preocuparse.

0

Ha pasado un tiempo desde que utilicé DataSets mecanografiados, pero veo en mi código anterior que usa el atributo codegen:nullValue. No creo que sea compatible con el diseñador, al menos no en VS2005 (que utilicé para ese proyecto), por lo que tendrías que abrir tu archivo xsd en el editor xml y hacerlo a mano.

el XML resultante sería algo como esto:

<xs:sequence> 
    <xs:element 
     name="MyIntColumn" 
     codegen:nullValue="0" 
     type="xs:int" 
     minOccurs="0" /> 
    <xs:element 
     name="MyBoolColumn" 
     codegen:nullValue="false" 
     type="xs:boolean" 
     minOccurs="0" /> 
    <xs:element 
     name="MyDateColumn" 
     codegen:nullValue="1900-01-01" 
     type="xs:dateTime" 
     minOccurs="0" /> 
</xs:sequence> 
+2

Desafortunadamente, esto introduce el concepto de "números mágicos", algo que me gustaría evitar si es posible. (Es decir, "Nulo" es claramente nulo, mientras que "0" no) –

8

creo que este mensaje el foro de ASP.NET será un poco de ayuda para la pregunta: Strongly-Typed DataSet/Nullable column issue

La única manera de establecer tales propiedades a nula es el uso de los métodos de ayuda que el generador de conjunto de datos también crea. Los métodos se lleva el nombre de su nombre de la columna , por lo que en su caso, usted debe tener métodos en la fila de datos objeto llamado IsApprovingUserNull() y SetApprovingUserNull().

Cuestiones relacionadas