Драйвер Oracle 11g odp.net с нулевым значением - PullRequest
2 голосов
/ 03 февраля 2012

У меня проблемы со сравнением нулевых значений с драйвером oracle 11g odp.net.Работает нормально с драйвером oracle 10g odp.net.Если столбец является нулевым в базе данных, то в datarow он имеет строковое значение null.

Этот код не работает:

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

Спасибо

Ответы [ 3 ]

5 голосов
/ 09 февраля 2012

Это как-то связано с ORacle11g.Как и то, что вы сказали, вместо реального нулевого значения, это пустая строка.Если вы проверяете из OracleDbType, нулевое значение в OracleDbType и типе данных CLR оба наследуют от INullable, поэтому ниже было мое решение:

((INullable) rowParamDBType.Value) .IsNull

Чтобы иметь более чистое решение, вы можете поместить его в расширение.

Если ваша строка имеет тип DbType, вы можете проверить на param.Value == DbNull.Value.


Хотя вышеприведенное также будет работать, реальное решение этой проблемы - использовать OracleDbTypeEx вместо OracleDbType в объявлении OracleParameter.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
}
2 голосов
/ 23 августа 2012

Здесь:

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

if (string.IsNullOrEmpty(organizationParentId)) {
    para6.Value = null; 
} else {
    para6.Value = long.Parse(organizationParentId);
}
2 голосов
/ 09 февраля 2012

Из документации Oracle:

f значение DbType, вы можете проверить для param.Value == DbNull.Value

Если значением является OracleDbType, вы можете проверить наличие ((INullable) param.Value) .IsNull, поскольку типы Oracle наследуют интерфейс INullable.

...