2014-09-24 26 views
6

Pracuję nad moją pierwszą aplikacją ASP.Net i wydaje się, że uderzam w wiele przeszkód (tło głównie w WinForms z niedawnym projektem MVC5 pod moim pasem).Obsługa wartości NULL podczas czytania przez OracleDataReader?

ja skutecznie czyni moje połączenie DB korzystając OracleCommand i wykonanie moje zapytanie, ale gdy próbuję czytania wierszy Otrzymuję Column contains NULL value w drugim rzędzie za odr.GetDecimal(1). Ktoś wie, jak obsługiwać wartości null podczas czytania przez OracleDataReader?

Poniżej jest mój kod:

 List<YearsOfService> yearsOfService = new List<YearsOfService>(); 
     string SQL = "SELECT SCHOOL_YEAR as YEAR, " + 
          "TOTAL_SERVICE_CREDIT as ServiceCredited, " + 
          "RETIREMENT_SALARY as Salary, " + 
          "SOURCE_VALUE as CoveredEmployer " + 
        "FROM " + Schema + ".RANDOM_ORACLE_TABLE a " + 
        "WHERE MEMBER_ACCOUNT_ID = :memberAccountId"; 

     DbConnection dbc = new DbConnection(); 
     OracleCommand cmd = dbc.GetCommand(SQL); 
     cmd.Parameters.Add(new OracleParameter("memberAccountId", memberAccountId)); 
     OracleDataReader odr = cmd.ExecuteReader(); 

     int counter = 0; 
     if (odr.HasRows) 
     { 
      while (odr.Read()) 
      { 
       YearsOfService yos = new YearsOfService(); 
       yos.Year = odr.GetInt16(0); 
       yos.ServiceCredited = odr.GetDecimal(1); // Error on Second Pass 

       yos.Salary = odr.GetDecimal(2); 

       yos.CoveredEmployer = odr.GetString(3); 

       yearsOfService.Add(yos); 
       counter++; 
      } 
     } 

     return yearsOfService; 
    } 

myślałem prosty czek na NULL, a jeśli tak, wymień 0 (ponieważ spodziewa się wartość Decimal) będą pracować z następujących, ale bez powodzenia. Ten sam błąd: yos.ServiceCredited = Convert.IsDBNull(odr.GetDecimal(1)) ? 0 : odr.GetDecimal(1);.

Pełna błędu:

Wyjątek typu „System.InvalidCastException” wystąpił w Oracle.DataAccess.dll ale nie było obsługiwane w kodzie użytkownika

Dodatkowe informacje: kolumna zawiera dane NULL

I potwierdziły, że są zwracane moje 2 wiersze znajdują się w następującym formacie:

Year|CreditedService|Salary |CoveredEmployer 
2013|0.70128  |34949.66|ER 
2014|NULL   | 2213.99|NULL 

Ktoś ma porady, jak najlepiej postępować? Jak powinienem obsługiwać otrzymywanie wartości NULL podczas czytania przez mój OracleDataReader?

+0

prostu ciekawy w tej konkretnej linii 'yos.ServiceCredited = odr.GetDecimal (1);' dlaczego nie odwołują pole nazwy i sprawdzanie wartości przed tylko przypisaniem wartości ..? 'Look up Null Coalesce' – MethodMan

+0

Nie użyłem OracleDataReader, ale zgaduję, że musisz sprawdzić, czy' odr.GetValue (1) 'ma wartość NULL zamiast' odr.GetDecimal (1) '. – juharr

+0

sprawdź odr.GetValue (0)! = DBNull.Value –

Odpowiedz

15
yos.ServiceCredited = odr.IsDBNull(1) ? 0 : odr.GetDecimal(1); 

OracleDataReader zapewnia metodę IsDBNull().

A Docs na GetDecimal() pytają nas, aby to zrobić

Call IsDBNull to check for null values before calling this method.

+0

Dzięki Abhi, to zrobiło sztuczkę! Próbowałem wcześniej użyć metody 'IsDBNull()', ale implementowałem ją niepoprawnie. Wcześniej myślę, że próbowałem coś w stylu 'yos.ServiceCredited = Convert.IsDBNull (odr.GetDecimal (1))'. To jest mój pierwszy raz przy użyciu 'OracleDataReader' i jestem niedoświadczony, jak robi" kolumny "odniesienia za pomocą różnych' Get() '. Dzięki za pomoc! –

+0

dzięki za to. Ktoś jeszcze myśli, że to absolutne szaleństwo, że klient musi wykonać takie wstępne połączenie, aby dowiedzieć się, czy wartość jest zerowa, zanim ją przeczytasz? Dlaczego 'GetDecimal()' (etc) nie zwraca wartości Null jak każdy inny sterownik DB? Wygląda na szalonego – Black