Domanda

Nel mio database, ho alcune colonne in una delle mie tabelle che sono valori bit (booleani). Possono essere NULL poiché i campi non contengono sempre dati.

Ho completato il processo di creazione di un DataSet XSD usando la tabella e mi sono assicurato che il campo AllowDBNull sia impostato su True.

Tuttavia, quando estraggo un record dal database nel datatable usando il metodo GetData configurato, mi imbatto nel seguente errore:

[InvalidCastException: Conversion from type 'DBNull' to type 'Boolean' is not valid.]

Devo specificare qualcosa di diverso rispetto al campo DefaultValue per la colonna o c'è qualche altro campo da impostare?

Sono ancora in fase di sviluppo con questo progetto, quindi se si preferisce cambiare i campi in un carattere e usare un'opzione S / N / NULL, non sono troppo contrario a procedere in questo modo.

È stato utile?

Soluzione

IMHO non dovresti consentire valori null in un campo bit / booleano.

Mike Hadlow ha un buon post su questo qui:

http://mikehadlow.blogspot.com/2006/10/nullability -voodoo.html

Booleano è per definizione un tipo a due stati. Rendendolo nullable, si aggiunge un terzo stato. Tornerà a perseguitarti ad un certo punto.

Altri suggerimenti

Non sono d'accordo con Iain. La logica a tre valori è valida quanto la logica a 2 valori. La persona nel tavolo è viva o morta o non sai se è vivo o morto. Se Mike avesse la sua strada, non potevi usare un po 'qui. Avresti bisogno di un FK in una tabella di stato, 1 = vivo, 2 = morto, 3 = sconosciuto.

L'intero scopo del bit è di risparmiare spazio, è sempre possibile rendere la colonna un CHAR (1) con un vincolo che limita i valori a T o F, Y o N (o U).

Ma penso che Iain stia interpretando male quello che sta dicendo Mike. Mike non scoraggia l'uso di Nulls, dopo tutto pensa che la colonna EndDate dovrebbe essere nulla fino al completamento del processo. Sta solo dicendo che non dare un valore nullo nella colonna con proprietà mistiche ... come se fosse la chiave per sapere se un processo è in un certo stato.

In effetti, i null in un database hanno alcuni effetti collaterali molto utili. Oracle (forse altri database) non indicizza i null. Quindi, se hai una colonna in cui è importante un solo valore, ad esempio hai un elenco di dipendenti che non elimini mai e una colonna di bit Is_Active_Employee indicizzata. In questo caso, per un'azienda consolidata, il numero di dipendenti che hai avuto è > > > rispetto al numero di dipendenti che hai ora. Supponi di avere 1% 1 e 99% 0.

Quell'indice è 99 volte più grande di quanto deve essere. Sta indicizzando tutti gli 1, il che va bene dato che sono l'1% della tabella, ma è anche caricato con 0 per le righe che NON POTREI MAI usare quell'indice per trovare. Se vuoi tutti i dipendenti inattivi, l'indicizzazione verrà ignorata e verrà eseguito un FTS. Quindi 1 e NULL sarebbero MOLTO più efficienti dal punto di vista del database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top