Oracle 11g odp.net驱动程序出现Null值问题



我在将null值与oracle 11g odp.net驱动程序进行比较时遇到问题。它与oracle10g odp.net驱动程序配合使用效果良好。如果数据库中的列为null,那么在数据行中它的字符串值为null

此代码失败:

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

感谢

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

((INullable)rowParamDBType.Value).IsNull

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

如果您的行是DbType,则可以检查param。值==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
}

此处:

var para6 = new OracleParameter("pOrganizationParentId", OracleDbType.Long){
    IsNullable = true,
};
if (string.IsNullOrEmpty(organizationParentId)) {
    para6.Value = null; 
} else {
    para6.Value = long.Parse(organizationParentId);
}

从Oracle文档:

如果该值是DbType,则可以检查param。值==DbNull.Value

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

最新更新