5

我们在检查“DBNull”的输出参数时遇到了问题。Oracle 存储过程或函数返回的“DBNull”值被 oracle 11g 客户端/ODP.Net 提供程序视为“null”字符串。这适用于 oracle 10g 客户端,因为它返回“DBNull”。因此,我们所有的“DBNull”检查都失败了

4

3 回答 3

6

ODP.NET 在值为 NULL 时返回“NULL”字符串 [ID 968857.1]

    Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED               

在本文档中 症状 变化 原因 解决方案

适用于:Oracle Data Provider for .NET - 版本:10.2.0.2.20 到 11.1.0.7.10 Microsoft Windows(32 位) Microsoft Windows x64(64 位)

症状 从以前版本的 Oracle Data Provider for .NET 迁移后,在检索空值方面可能会发生行为变化。虽然应用程序之前返回了一个空字符串,但现在获得了一个值为“null”的字符串。从 1.x ODP.NET 迁移到 2.x ODP.NET 的更改

原因 该行为是由于从 1.x Oracle Data Provider for .NET 迁移到 2.x 提供程序所致。2.x ADO.NET 支持提供者返回提供者特定类型的能力,这是从 .NET 1.x 到 2.x 的潜在“重大变化”之一。

ODP.NET 版本 9.2.x、10.1.x、10.2.0.1.0 都是 1.x 框架提供者。通常在从早期版本的 ODP 迁移到更新版本的 ODP 时会注意到此行为,但同时从 1.x 提供程序切换到 2.x 提供程序。导致此行为的是 .NET 框架支持的更改,而不是 Oracle 客户端版本的更改。

将应用程序迁移到 64 位操作系统时也可能会注意到此行为,因为没有 1.x 64 位框架。

解决方案 要解决此问题,需要修改代码。

作为一种解决方法,将 ODP.NET 用于 1.x(例如 1.111.7.0 而不是 2.111.7.0)将导致以前的行为,但请注意 1.x 提供程序未在任何其他版本的框架上进行测试或支持超过 1.x,并且不计划为 11.1.0.7.0 之后的任何版本提供对 1.x 的支持

如果操作系统是 64 位,则需要强制应用程序在 SYSWOW64 子系统(即 32 位)下运行才能使用 1.x ODP.NET。

要更正代码:

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

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

于 2010-06-25T01:47:23.577 回答
2

在 Oracle 发布的重大更改之后(请参阅下面的评论)。您需要在下面添加额外的位:

if (oraParam[7] == null || 
    oraParam[7].Value == DBNull.Value ||
    ((INullable)oraParam[7].Value).IsNull)

INullable 位于 Oracle.DataAccess.Types 命名空间中。

于 2010-06-25T01:08:10.487 回答
1

或者你可以试试...

(OracleString)result == OracleString.Null
于 2015-01-14T21:48:31.837 回答