【发布时间】:2014-11-19 09:48:10
【问题描述】:
我正在开发我的第一个 ASP.Net 应用程序,并且似乎遇到了很多障碍(主要是 WinForms 的背景,我最近有一个 MVC5 项目)。
我使用OracleCommand 成功建立了我的数据库连接并执行了我的查询,但是当我尝试通读这些行时,我在odr.GetDecimal(1) 的第二行得到一个Column contains NULL value。有人知道在通过 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;
}
我曾想过对 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
有人对如何最好地进行操作有建议吗?通过我的 OracleDataReader 读取时,我应该如何处理接收到 NULL 值?
【问题讨论】:
-
只是对这一行感到好奇
yos.ServiceCredited = odr.GetDecimal(1);你为什么不按名称引用字段并在分配值之前检查它的值..?Look up Null Coalesce -
我没用过OracleDataReader,但我猜你需要检查
odr.GetValue(1)是否为NULL而不是odr.GetDecimal(1)。 -
检查 odr.GetValue(0) != DBNull.Value
-
另一种选择是合并 SQL 中的值。
-
@DJKRAZE,不确定我是否理解您的意思。不过会查找 Coalesce。 @juharr:我试过了,但是我得到了一个错误,因为
yos.ServiceCredited期望Decimal值,而不仅仅是来自GetValue()的object。 @Syed:试过了,没有运气,同样的错误。
标签: c# asp.net oracle null datareader