2

我在将空值与 oracle 11g odp.net 驱动程序进行比较时遇到问题。它适用于 oracle 10g odp.net 驱动程序。如果数据库中的列为空,则在数据行中它的字符串值为null.

此代码失败:

int parentId =  row[PARENTID] != DBNull.Value ? int.Parse(row[PARENTID].ToString()) : 0;

谢谢

4

3 回答 3

5

这与ORacle11g 有关。就像你说的那样,它不是真正的空值,而是一个空字符串。如果您从 OracleDbType 检查,OracleDbType 和 CLR Datatype 中的 null 都继承自 INullable 所以下面是我的解决方案:

((INullable) rowParamDBType.Value).IsNull

要获得更清洁的解决方案,您可以将其放在扩展程序中。

如果您的行是 DbType,您可以检查 param.Value==DbNull.Value。


虽然上述方法也可以,但这个问题的真正解决方案是在您的 OracleParameter 声明中使用OracleDbTypeEx而不是 OracleDbType。OracleDbTypeEx 会将值返回给 DBType,因此它将识别 DBNull。请参阅下面的示例代码。

command.Parameters.Add(new OracleParameter
                            {
                                ParameterName = "param_out",
                                OracleDbTypeEx = OracleDbType.Decimal,
                                Direction = ParameterDirection.Output
                            });

if (command.Parameters["param_out"].Value != Convert.DBNull)
{
  //your code here
}
于 2012-02-08T20:43:07.420 回答
4

这里 :

var para6 = new OracleParameter("pOrganizationParentId", OracleDbType.Long){
    IsNullable = true,
};

if (string.IsNullOrEmpty(organizationParentId)) {
    para6.Value = null; 
} else {
    para6.Value = long.Parse(organizationParentId);
}
于 2012-08-23T10:08:33.773 回答
3

来自 Oracle 文档:

f 值是 DbType,您可以检查 param.Value==DbNull.Value

如果值是 OracleDbType,您可以检查 ((INullable)param.Value).IsNull,因为 Oracle 类型继承了 INullable 接口。

于 2012-02-08T20:53:58.997 回答