通过OracleDataReader读取时处理NULL值?

Ana*_*tic 11 c# asp.net oracle null datareader

我正在研究我的第一个ASP.Net应用程序,并且似乎遇到了很多障碍(主要是在WinForms背景下,最近有一个MVC5项目).

我正在使用OracleCommand并执行我的查询成功建立数据库连接,但是当我尝试读取行时,我Column contains NULL value在第二行获取了一个odr.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;
    }
Run Code Online (Sandbox Code Playgroud)

我曾经想过一个简单的检查NULL,如果是这样,用0替换(因为期望一个Decimal值)将适用于以下,但没有运气.同样的错误:yos.ServiceCredited = Convert.IsDBNull(odr.GetDecimal(1)) ? 0 : odr.GetDecimal(1);.

完整错误是:

Oracle.DataAccess.dll中出现"System.InvalidCastException"类型的异常,但未在用户代码中处理

附加信息:列包含NULL数据

我已确认我返回的2行采用以下格式:

Year|CreditedService|Salary  |CoveredEmployer
2013|0.70128        |34949.66|ER
2014|NULL           | 2213.99|NULL
Run Code Online (Sandbox Code Playgroud)

有人建议如何最好地进行?在读取OracleDataReader时,如何处理接收NULL值?

Sou*_*tra 28

yos.ServiceCredited = odr.IsDBNull(1) ? 0 : odr.GetDecimal(1);
Run Code Online (Sandbox Code Playgroud)

OracleDataReader提供了一种IsDBNull()方法.

文档GetDecimal()要求我们这样做

调用IsDBNull以在调用此方法之前检查空值.

  • 谢谢你.其他人都认为客户必须在这样做之前进行预检查才能确定值是否为Null是绝对疯狂的?为什么`GetDecimal()`(etc)不像其他每个DB驱动程序一样返回Null值?似乎很疯狂 (2认同)