C# 通过OracleDataReader读取时是否处理空值?
我正在开发我的第一个ASP.Net应用程序,似乎遇到了很多障碍(我的背景主要是WinForms,最近有一个MVC5项目) 我正在使用C# 通过OracleDataReader读取时是否处理空值?,c#,asp.net,oracle,null,datareader,C#,Asp.net,Oracle,Null,Datareader,我正在开发我的第一个ASP.Net应用程序,似乎遇到了很多障碍(我的背景主要是WinForms,最近有一个MVC5项目) 我正在使用OracleCommand成功地建立数据库连接并执行我的查询,但是当我尝试读取这些行时,我在odr.GetDecimal(1)的第二行得到一个列包含空值。有人知道在通过OracleDataReader读取时如何处理空值吗 yos.ServiceCredited = odr.IsDBNull(1) ? 0 : odr.GetDecimal(1); 下面是我的代码:
OracleCommand
成功地建立数据库连接并执行我的查询,但是当我尝试读取这些行时,我在odr.GetDecimal(1)
的第二行得到一个列包含空值。有人知道在通过OracleDataReader读取时如何处理空值吗
yos.ServiceCredited = odr.IsDBNull(1) ? 0 : odr.GetDecimal(1);
下面是我的代码:
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;
}
有人对如何最好地进行有什么建议吗?在通过OracleDataReader进行读取时,如何处理接收空值的问题
yos.ServiceCredited = odr.IsDBNull(1) ? 0 : odr.GetDecimal(1);
OracleDataReader
提供了一个IsDBNull()
方法
上面的文档要求我们这样做
调用此方法之前,请调用IsDBNull检查空值
只是好奇这一行yos.servicerecredited=odr.GetDecimal(1)代码>为什么在分配值之前不按名称引用字段并检查其值<代码>查找空合并
我没有使用OracleDataReader,但我想您需要检查odr.GetValue(1)
是否为空,而不是odr.GetDecimal(1)
。检查odr.GetValue(0)!=DBNull.value另一个选项是合并SQL中的值。@DJKRAZE,我不确定我是否理解你的意思。不过,它会联合起来@朱哈尔:我试过了,但不管怎样,我都会得到一个错误,因为yos.ServiceCredited
需要一个Decimal
值,而不仅仅是GetValue()
中的对象@赛义德:试过了,不走运,同样的错误。谢谢阿比,这成功了!我之前尝试过使用IsDBNull()
方法,但实现不正确。之前,我想我尝试了类似于yos.serviceecredited=Convert.IsDBNull(odr.GetDecimal(1))
的方法。这是我第一次使用OracleDataReader
,我对如何使用不同的Get()
来引用“列”缺乏经验。谢谢你的帮助!谢谢你。还有人认为客户端在读取之前必须进行这样的预检查以确定值是否为空是绝对疯狂的吗?为什么GetDecimal()
(etc)不像其他DB驱动程序那样返回空值?似乎crazy@Black我想这就是我们使用Oracle时得到的结果?@黑色,因为十进制值不能为空。如果该方法能够像您描述的那样返回null,那么您必须始终检查结果是否不是null,以便将其分配给十进制。