2012-05-11 30 views
18

Sulla linea: bool travel = fill.travel.Value; Sto ottenendo il seguente errore:L'oggetto Nullable deve avere un valore?

Nullable object must have a value

e io non sono sicuro perché. Tutto quello che voglio fare è ottenere il valore nel database di viaggio che è attualmente falso. Qualsiasi aiuto sarebbe apprezzato.

using (var db = new DataClasses1DataContext()) 
{ 
    var fill = (from f in db.expenseHdrs 
       where f.rptNo == getPkRowReport() 
       select f).FirstOrDefault(); 

    txtReportDesc.Text = fill.description; 
    txtPeriod.Text = fill.period; 
    txtPurpose.Text = fill.purpose; 

    bool travel = fill.travel.Value; 
    chkTravel.Checked = travel 
} 
+0

ciò che 'getPkRowReport' tornare? –

+8

Sembra che fill.travel sia un bool nullable ('bool?'), Ed è NULL nel database. – driis

+1

@driis, questa è la risposta, quindi tanto vale spostarla in basso. –

risposta

30

Si può sempre passare a

fill.travel.GetValueOrDefault() 

Per fornire il valore di default (false), o il valore della colonna booleana dal database. Oppure puoi specificare l'impostazione predefinita con un sovraccarico. In entrambi i casi, il nullable al momento non ha un valore, motivo per cui si ottiene quell'eccezione.

3

Si otterrà un InvalidOperationException se si accede alla proprietà Nullable.Value quando la proprietà HasValue è falsa.

3

È possibile controllare se la variabile annullabile ha un certo valore come questo prima in realtà accedere suo valore

if(fill.travel.HasValue) 
{ 
    bool travel = fill.travel.Value; 
} 
2

Il valore provenienti dalla banca dati è un valore booleano annullabile. Quando chiami Nullable.Value e il valore è null, otterrai questa eccezione. Considera di verificare la proprietà Nullable.HasValue prima di chiamare .Value.

3

Si sta tentando di accedere alla proprietà dall'oggetto inesistente (il vostro fill.travel è nullo, e ti chiama puntello da esso), è possibile utilizzare operatore di coalesce (NET 4.0):

bool travel = fill.travel ?? false; 
1

Null non è falso Vedere la serie di articoli del blog di Eric Lippert a questo proposito: http://blogs.msdn.com/b/ericlippert/archive/2012/03/26/null-is-not-false.aspx

È necessario elaborare un risultato nullo in un falso, se è così che si desidera tradurlo.

Per rendere questo chiaro caso, si consideri questo codice:

bool travel; 
bool? temptravel = fill.travel.Value; 
if(temptravel == true) 
    travel = true; 
else 
    travel = false; 

o semplicemente usare la soluzione di Val Bachtin se si utilizza .Net 4

Problemi correlati