2014-09-24 112 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