2009-05-18 14 views
5

Sto lavorando con i set di dati fortemente tipizzati .NET e ho una tabella con una colonna int valori nullable (e anche una colonna DateTime nullable).Colonna Nullable Int in DataSet

Apparentemente c'è un bug con il progettista del set di dati che impedisce di avere colonne nullable su questi tipi di dati. Il progettista consente solo "throw exception" come comportamento predefinito per valori null. Sfortunatamente, quando si utilizza un tipo di dati nullable nel database, un valore nullo È un valore legittimo ma genera un'eccezione generata quando si tenta di recuperare questo valore da una riga di dati.

Ho visto diverse pubblicazioni di newsgroup su questo problema, ma non ho ancora trovato soluzioni alternative decenti a questo problema.

Mi piacerebbe sapere come altri hanno affrontato questo problema.

Grazie.

+0

CHIARIMENTO: il set di dati utilizza DBNull (il valore predefinito), non null. – goombaloon

risposta

2

DBNull era fondamentalmente portato a giocare a che fare con tipi di valore non nullable, pre .NET 2.0. A causa della progettazione di ADO.NET, non è possibile evitare DBNull, a meno che non si scelga un approccio più diretto. DBNull è integrato nel core di ADO.NET, quindi dovrai imparare a conviverci, se vuoi continuare a utilizzarlo.

Se si forniscono i propri oggetti di trasporto dati anziché fare affidamento sullo spazio dei nomi System.Data generico, è possibile controllare (durante la lettura dei risultati con un lettore di dati) se il valore è nullo, ma sarà necessario in qualche modo per generare oggetti e mapping fortemente tipizzati perché è un lavoro davvero noioso.

Per quanto ne so, DBNull è integrato nel design di ADO.NET e il modo migliore per creare le tue app, se lo usi, è quello di coalizzare (normalizzare) DBNull e null. Fondamentalmente, fornire la propria classe DbConvert che intercetta DBNull e restituisce un riferimento null effettivo se il valore è DBNull. Questo è un requisito minimo, ma non appena ciò avrà successo, avrai meno valori di DBNull che galleggiano attorno a cui preoccuparti.

0

È passato un po 'di tempo dall'ultima volta che ho utilizzato DataSet digitati, ma nel mio vecchio codice ho utilizzato l'attributo codegen:nullValue. Non penso che sia supportato dal designer, almeno non in VS2005 (che ho usato per quel progetto), quindi dovresti aprire il tuo file xsd nell'editor xml e farlo a mano.

L'XML risultante sarebbe simile a questa:

<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

Sfortunatamente questo introduce il concetto di "numeri magici", qualcosa che vorrei evitare se possibile. (Ovvero, "Null" è nettamente nullo, mentre "0" non lo è) –

8

penso che questo post su ASP.NET forum sarà un aiuto per la domanda: Strongly-Typed DataSet/Nullable column issue

L'unico modo per impostare tali proprietà per nulla è quello di utilizzare i metodi helper che il generatore di set di dati crea anche. I metodi sono chiamato dopo il nome della colonna , così nel tuo caso, si dovrebbe avere metodi sulla riga di dati oggetto chiamato IsApprovingUserNull() e SetApprovingUserNull().