当值为 NULL 时 ODP.NET 返回“NULL”字符串 [ID 968857.1]
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
在本文档中
症状
变化
原因
解决方案
适用于:
适用于 .NET 的 Oracle 数据提供程序 - 版本:10.2.0.2.20 至 11.1.0.7.10
微软视窗(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 接口。