2012-05-11 11 views
18

Na linii: bool travel = fill.travel.Value; otrzymuję następujący błąd:Obiekt Nullable musi mieć wartość?

Nullable object must have a value

i nie jestem pewien dlaczego. Wszystko, co chcę zrobić, to uzyskać wartość w bazie danych podróży, która obecnie jest fałszywa. Każda pomoc będzie doceniona.

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

co robi 'getPkRowReport' powrócić? –

+8

Wygląda na to, że fill.travel jest zerowalnym boolem ('bool?') I ma wartość NULL w bazie danych. – driis

+1

@driis, to jest odpowiedź, więc równie dobrze możesz przesunąć ją poniżej. –

Odpowiedz

30

Zawsze można przełączyć się

fill.travel.GetValueOrDefault() 

Aby zapewnić domyślne (false) lub wartość logiczną kolumny z bazy danych. Lub możesz określić wartość domyślną z przeciążeniem. Tak czy inaczej, nullable obecnie nie ma wartości, dlatego otrzymujesz wyjątek.

3

Dostaniesz InvalidOperationException jeśli dostęp do właściwości Nullable.Value gdy właściwość HasValue jest fałszywe.

3

Można sprawdzić, czy zmienna pustych ma jakąś wartość takiego przed swój faktycznie dostęp do jej wartości

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

Wartość pochodzących z bazy danych jest pustych logiczna. Kiedy wywołasz Nullable.Value, a wartość jest pusta, otrzymasz ten wyjątek. Zastanów się, czy sprawdzić właściwość Nullable.HasValue przed wywołaniem. Wartość.

3

Próbujesz uzyskać dostęp do nieruchomości z nieistniejącego obiektu (swoją fill.travel jest zerowy, a nazywając rekwizyt z niego), można użyć operatora zlewają (.NET 4.0):

bool travel = fill.travel ?? false; 
1

Null nie jest fałszem. Zobacz artykuł na blogu Eric Lipperta na ten temat: http://blogs.msdn.com/b/ericlippert/archive/2012/03/26/null-is-not-false.aspx

Musisz przetworzyć wynik zerowy na wartość false, jeśli tak chcesz przetłumaczyć.

Aby to sprawa jasna, należy rozważyć ten kod:

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

Albo po prostu użyć rozwiązanie Val Bachtin, jeśli używasz .NET Framework 4