2014-09-24 113 views
6

我正在研究我的第一個ASP.Net應用程序,並且似乎遇到了很多障礙(背景主要在WinForms中,最近的MVC5項目在我的腰帶下)。通過OracleDataReader讀取時處理NULL值?

我成功地實現了利用OracleCommand我的數據庫連接並執行我的查詢,但是當我試圖通過行讀,我在第二行得到一個Column contains NULL valueodr.GetDecimal(1)。任何人都知道如何通過OracleDataReader讀取時處理空值?

下面是我的代碼:

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

我原以爲一個簡單的檢查空,如果是用0代替(因爲期待Decimal值)會與下面的工作,但沒有運氣。同樣的錯誤:yos.ServiceCredited = Convert.IsDBNull(odr.GetDecimal(1)) ? 0 : odr.GetDecimal(1);

全部錯誤是:

「」類型的異常出現在Oracle.DataAccess.dll但在用戶代碼中沒有處理

附加信息:列包含NULL數據

我已經證實,正在返回我的2行是按以下格式:

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

任何人都有關於如何最好地進行的建議?我應該如何處理通過OracleDataReader讀取時接收NULL值?

+0

只是好奇,在這個特別的行'yos.ServiceCredited = odr.GetDecimal(1);'怎麼來的,你的名字都沒有引用領域,在分配值之前檢查它的值..? '查找空合併' – MethodMan 2014-09-24 19:20:05

+0

我還沒有使用OracleDataReader,但我想你需要檢查'odr.GetValue(1)'是NULL而不是'odr.GetDecimal(1)'。 – juharr 2014-09-24 19:20:21

+0

檢查odr.GetValue(0)!= DBNull.Value – 2014-09-24 19:20:39

回答

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

OracleDataReader提供了IsDBNull()方法。

而且在GetDecimal()的文檔要求我們做到這一點

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

+0

感謝Abhi,這個伎倆!我曾嘗試過使用'IsDBNull()'方法,但我錯誤地實現了它。以前我想我嘗試過類似'yos.ServiceCredited = Convert.IsDBNull(odr.GetDecimal(1))'。這是我第一次使用'OracleDataReader',並且我對它如何使用不同的'Get()'做「列」引用沒有經驗。謝謝你的幫助! – 2014-09-24 19:32:53

+0

謝謝你。任何人都認爲客戶在閱讀之前必須進行預檢查才能發現該值是否爲空,這是絕對的瘋狂行爲?爲什麼'GetDecimal()'(etc)不像其他數據庫驅動程序那樣返回一個空值?看起來很瘋狂 – Black 2017-01-13 12:45:41