2012-05-11 16 views
18

Auf der Linie: bool travel = fill.travel.Value; Ich erhalte die folgende Fehlermeldung:Nullable-Objekt muss einen Wert haben?

Nullable object must have a value

, und ich bin nicht sicher, warum. Alles, was ich tun möchte, ist, den Wert in der Reisedatenbank zu erhalten, der momentan falsch ist. Jede Hilfe wäre willkommen.

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

was 'getPkRowReport' zurückgibt verwenden? –

+8

Es klingt wie fill.travel ist ein Nullable bool ('bool?'), Und es ist NULL in der Datenbank. – driis

+1

@driis, das ist die Antwort, also können Sie es auch unten verschieben. –

Antwort

30

können Sie wechseln immer

fill.travel.GetValueOrDefault() 

den Standard (false) zu liefern, oder den Wert der Booleschen Spalte aus der Datenbank. Oder Sie können den Standard mit einer Überladung angeben. In beiden Fällen hat das Nullable derzeit keinen Wert, weshalb Sie diese Ausnahme erhalten.

3

Sie erhalten eine InvalidOperationException, wenn Sie die Nullable.Value Eigenschaft zugreifen, wenn die HasValue Eigenschaft falsch ist.

3

Sie können prüfen, ob Nullable-Variable einen Wert wie diese hat, bevor Sie seinen Wert tatsächlich zugreifen

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

Der Wert aus der Datenbank kommen, ist ein nullable boolean. Wenn Sie Nullable.Value aufrufen und der Wert null ist, erhalten Sie diese Ausnahme. Überprüfen Sie die Eigenschaft Nullable.HasValue, bevor Sie .Value aufrufen.

3

Sie versuchen Eigenschaft aus dem nicht vorhandenen Objekt zuzugreifen (Ihr fill.travel ist null, und Sie prop von ihm fordern), Sie coalesce Operator (.NET 4.0) verwenden können:

bool travel = fill.travel ?? false; 
1

Null ist nicht falsch. Siehe Eric Lipperts Blog-Artikelserie dazu unter: http://blogs.msdn.com/b/ericlippert/archive/2012/03/26/null-is-not-false.aspx

Sie müssen ein Null-Ergebnis in ein Falsches verarbeiten, wenn Sie es so übersetzen möchten.

Zu diesem Fall deutlich zu machen, sollten Sie diesen Code:

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

Oder nur Val Bachtins Lösung verwenden, wenn Sie .Net 4