2014-09-24 11 views
6

Sto lavorando alla mia prima applicazione ASP.Net e sembra che stia colpendo un sacco di ostacoli (in primo luogo in WinForms con un progetto MVC5 recente sotto la cintura).Gestisce valori NULL durante la lettura tramite OracleDataReader?

sto facendo con successo il mio connessione DB usando OracleCommand e l'esecuzione la mia domanda, ma quando provo a leggere tra le righe mi stanno un Column contains NULL value in seconda fila per odr.GetDecimal(1). Qualcuno sa come gestire i valori nulli durante la lettura attraverso un OracleDataReader?

Qui di seguito è il mio codice:

 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; 
    } 

avevo pensato un semplice controllo per NULL e se è così sostituirlo con 0 (in quanto in attesa di un valore di Decimal) avrebbe funzionato con la seguente, ma senza fortuna. Stesso errore: yos.ServiceCredited = Convert.IsDBNull(odr.GetDecimal(1)) ? 0 : odr.GetDecimal(1);.

errore completa è:

Un'eccezione di tipo 'System.InvalidCastException' in Oracle.DataAccess.dll, ma non è stata gestita nel codice utente

Ulteriori informazioni: La colonna contiene i dati NULL

mi hanno confermato che i miei 2 file restituiti sono nel seguente formato:

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

Chiunque ha consigli su come meglio procedere? Come devo gestire la ricezione del valore NULL durante la lettura tramite OracleDataReader?

+0

solo curioso su questa particolare linea 'yos.ServiceCredited = odr.GetDecimal (1);' come mai non fa riferimento il campo per nome e il controllo del valore prima di assegnare semplicemente il valore ..? 'Look up Null Coalesce' – MethodMan

+0

Non ho usato OracleDataReader, ma suppongo che sia necessario controllare se' odr.GetValue (1) 'è NULL invece di' odr.GetDecimal (1) '. – juharr

+0

controllare per odr.GetValue (0)! = DBNull.Value –

risposta

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

OracleDataReader fornisce un metodo IsDBNull().

E i documenti sul GetDecimal() ci chiedono di fare questo

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

+0

Grazie Abhi, questo ha fatto il trucco! Avevo provato ad usare il metodo 'IsDBNull()' in precedenza, ma lo stavo implementando in modo errato. In precedenza penso di aver provato qualcosa come 'yos.ServiceCredited = Convert.IsDBNull (odr.GetDecimal (1))'. Questa è la mia prima volta che uso 'OracleDataReader' e non ho esperienza di come faccia i riferimenti alla" colonna "usando i diversi' Get() '. Grazie per l'aiuto! –

+0

grazie per questo. Qualcun altro pensa che sia una follia assoluta che un Cliente debba effettuare una chiamata di pre-controllo come questa per scoprire se il valore è Null prima di leggerlo? Perché 'GetDecimal()' (etc) non restituisce un valore Null come ogni altro driver DB? Sembra pazzo – Black