2014-09-24 13 views
6

İlk ASP.Net uygulamasında çalışıyorum ve çok sayıda engele çarpıyor gibi görünüyorum (arka plan öncelikli olarak WinForms'da arkamda yeni MVC5 projesi ile).OracleDataReader ile okurken NULL değerleri işlensin mi?

başarıyla OracleCommand kullanarak DB bağlantısı oluşturmak ve benim Sorgu yürütülürken, ama satır okuduktan çalıştığımda odr.GetDecimal(1) için ikinci satırda bir Column contains NULL value alıyorum ediyorum. Bir OracleDataReader'dan okurken boş değerlerin nasıl ele alınacağını bilen var mı? böylece 0 ile değiştirin eğer (bir Decimal değer bekliyor beri) NULL için basit bir kontrol düşünce ve sahada

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

takipçinizin çalışacak, ama hayır şans:

Aşağıda benim kodudur. Aynı hata: yos.ServiceCredited = Convert.IsDBNull(odr.GetDecimal(1)) ? 0 : odr.GetDecimal(1);.

Tam hatadır:

türü 'System.InvalidCastException' istisna Oracle.DataAccess.dll oluştu ancak kullanıcı kodu işlenmedi

ek bilgiler: Kolon BOŞ verileri içeriyor

benim 2 satır iade edilen doğruladı

aşağıdaki biçimdedir:

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

Herkesin en iyi şekilde nasıl ilerleyeceğine dair tavsiyesi var mı? OracleDataReader'ımı okurken NULL değerini almayı nasıl ele almalıyım?

+0

bu özel hat üzerinde sadece merak 'yos.ServiceCredited = odr.GetDecimal (1);' nasıl adıyla alanını başvuran değildir gelip sadece değeri atamadan önce değeri kontrol etmek ..? 'Look Up Null Coalesce – MethodMan

+0

OracleDataReader kullanmadım, ancak 'odr.GetValue (1)', odr.GetDecimal (1) 'yerine NULL olup olmadığını kontrol etmeniz gerektiğini tahmin ediyorum. – juharr

+0

odr.GetValue (0)! = DBNull.Value için kontrol edin –

cevap

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

OracleDataReader bir IsDBNull() yöntem sağlamaktadır.

Ve GetDecimal() üzerinde docs yapmak bize sorun bu

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

+0

Teşekkürler Abhi, bu hile yaptı! Daha önce IsDBNull() yöntemini kullanmayı denedim, ancak yanlış bir şekilde uyguluyordum. Önceden sanırım yos.serviceCredited = Convert.IsDBNull (odr.GetDecimal (1)) 'gibi bir şeyi denedim. Bu benim OracleDataReader kullanarak ilk kez ve ben farklı "Get()' ler kullanarak "sütun" referanslar nasıl yaptığı ile deneyimsizim. Yardım ettiğin için teşekkür ederim! –

+0

bunun için teşekkürler. Başka birinin, bir Müşterinin, okumadan önce değerin Boş olup olmadığını öğrenmek için böyle bir ön kontrol yapması gerektiği mutlak bir çılgınlık olduğunu düşünüyor musunuz? Neden GetDecimal() '(etc), diğer her DB sürücüsü gibi bir boş değer döndürmüyor? Deli görünüyor – Black

İlgili konular