2014-09-24 16 views
6

Tôi đang làm việc trên ứng dụng ASP.Net đầu tiên của mình và dường như đang gặp phải rất nhiều rào cản (chủ yếu là nền tảng trong WinForms với dự án MVC5 gần đây dưới đai của tôi).Xử lý giá trị NULL khi đọc qua OracleDataReader?

Tôi đang thực hiện thành công kết nối DB bằng cách sử dụng OracleCommand và thực hiện truy vấn của mình, nhưng khi tôi thử đọc qua các hàng, tôi nhận được Column contains NULL value trên hàng thứ hai cho odr.GetDecimal(1). Bất cứ ai cũng biết cách xử lý các giá trị null khi đọc qua một OracleDataReader?

Dưới đây là mã của tôi:

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

Tôi đã nghĩ một kiểm tra đơn giản cho NULL và nếu như vậy thay bằng 0 (vì chờ đợi một giá trị Decimal) sẽ làm việc với những điều sau đây, nhưng không có may mắn. Lỗi tương tự: yos.ServiceCredited = Convert.IsDBNull(odr.GetDecimal(1)) ? 0 : odr.GetDecimal(1);.

Full lỗi là:

Một ngoại lệ của loại 'System.InvalidCastException' xảy ra ở Oracle.DataAccess.dll nhưng không được xử lý theo mã người dùng

thông tin bổ sung: Cột chứa dữ liệu NULL

Tôi đã xác nhận rằng 2 hàng của tôi được trả lại có định dạng sau:

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

Bất kỳ ai cũng có lời khuyên về cách tiến hành tốt nhất? Làm thế nào tôi nên xử lý nhận giá trị NULL khi đọc thông qua OracleDataReader của tôi?

+0

chỉ tò mò về dòng này cụ thể 'yos.ServiceCredited = odr.GetDecimal (1); 'làm thế nào mà bạn không tham khảo lĩnh vực này theo tên và kiểm tra giá trị trước khi chỉ gán giá trị ..? 'Tra cứu Null Coalesce' – MethodMan

+0

Tôi đã không sử dụng OracleDataReader, nhưng tôi đoán bạn cần kiểm tra nếu' odr.GetValue (1) 'là NULL thay vì' odr.GetDecimal (1) '. – juharr

+0

kiểm tra odr.GetValue (0)! = DBNull.Value –

Trả lời

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

OracleDataReader cung cấp phương thức IsDBNull().

Và các tài liệu trên GetDecimal() yêu cầu chúng tôi làm điều này

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

+0

Cảm ơn Abhi, điều này đã làm các trick! Tôi đã thử sử dụng phương thức 'IsDBNull()' trước đó, nhưng tôi đã thực hiện nó không chính xác. Trước đây tôi nghĩ rằng tôi đã thử một cái gì đó như 'yos.ServiceCredited = Convert.IsDBNull (odr.GetDecimal (1))'. Đây là lần đầu tiên tôi sử dụng 'OracleDataReader' và tôi không có kinh nghiệm về cách tham chiếu" cột "bằng cách sử dụng' Get() 'khác nhau. Cảm ơn bạn đã giúp đỡ! –

+0

cảm ơn vì điều này. Bất cứ ai khác nghĩ rằng đó là sự điên rồ tuyệt đối mà một khách hàng phải thực hiện một cuộc gọi kiểm tra trước như thế này để tìm ra nếu giá trị là Null trước khi bạn đọc nó? Tại sao 'GetDecimal()' (vd) chỉ trả về giá trị Null giống như mọi trình điều khiển DB khác? Có vẻ điên rồ – Black

Các vấn đề liên quan