C# Oracle 11g odp.net驱动程序出现空值问题

C# Oracle 11g odp.net驱动程序出现空值问题,c#,null,oracle11g,odp.net,dbnull,C#,Null,Oracle11g,Odp.net,Dbnull,我在将空值与oracle 11g odp.net驱动程序进行比较时遇到问题。它可以与oracle 10g odp.net驱动程序配合使用。如果一列在数据库中为null,那么在datarow中它的字符串值为null 此代码失败: int parentId = row[PARENTID] != DBNull.Value ? int.Parse(row[PARENTID].ToString()) : 0; 谢谢这与ORacle11g有关。 就像你说的,它不是真正的空值,而是一个空字符串。 如果您是

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

此代码失败:

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

谢谢

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

((INullable)rowParamDBType.Value).IsNull

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

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


虽然上述方法也可以,但解决此问题的真正方法是在OracleParameter声明中使用OracleDbTypeEx而不是OracleDbType。OracleDbTypex将把值返回给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
}

从Oracle文档:

如果值是DbType,则可以检查param.value==DbNull.value

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

此处:

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

if (string.IsNullOrEmpty(organizationParentId)) {
    para6.Value = null; 
} else {
    para6.Value = long.Parse(organizationParentId);
}

代码是如何失败的?(失败和不工作的情况略有不同…)我的意思是第[PARENTID]行的值。ToString=“null”而不是null。所以当它试图将其解析为整数时。我有个例外。“输入字符串格式不正确”行[PARENTID]的类型是什么?如果它是
string
object
,并且如果该值真的为null,则会抛出NullReferenceException(除非有人偷偷进入扩展方法!)。可能存储的数据是字符串“null”?(或者适配器中有什么东西坏了,或者有一个标志…@pst我从其他用户那里了解到,如果数据库中的列为null,Oracle现在将花费“null”值。