2012-02-02 2 views
2

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

Этот код не:

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

Благодаря

+0

Hows делает код не получится? (Неудачные и неработающие ожидаемые немного разные случаи ...) –

+0

Я имею в виду значение строки [PARENTID] .ToString = "null" вместо null. Поэтому, когда он пытается проанализировать его как целое. Я получаю исключение. «Строка ввода не в правильном формате» –

+0

Каков тип 'row [PARENTID]'? Если это 'string' или' object', и если значение * действительно равно null, то это вызовет исключение NullReferenceException (* если только * кто-то не проскользнул в методе расширения!). Возможно, данные, хранящиеся *, являются * строкой «null»? (Или есть что-то сломанное или флаг в адаптере ...) –

ответ

1

Здесь:

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

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

Это что-то делать с ORacle11g. Как и вы сказали, вместо реального значения null это пустая строка. Если вы проверяете из OracleDbType, нуль в OracleDbType и CLR DATATYPE оба наследуется от 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

Фромм документация Oracle:

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

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

Смежные вопросы