Oracle11g Oracle 11g ODP.Net提供程序的DBNull问题
我们在检查“DBNull”的输出参数时面临问题。Oracle存储过程或函数返回的“DBNull”值被Oracle 11g client/ODP.Net提供程序视为“null”字符串。这在oracle 10g客户端上运行良好,因为它返回“DBNull”。Oracle11g Oracle 11g ODP.Net提供程序的DBNull问题,oracle11g,odp.net,Oracle11g,Odp.net,我们在检查“DBNull”的输出参数时面临问题。Oracle存储过程或函数返回的“DBNull”值被Oracle 11g client/ODP.Net提供程序视为“null”字符串。这在oracle 10g客户端上运行良好,因为它返回“DBNull”。 正因为如此,在Oracle发布了突破性的更改之后,我们所有的“DBNull”检查都失败了(见下面的注释)。您需要在下面添加额外的位: if (oraParam[7] == null || oraParam[7].Value == DBN
正因为如此,在Oracle发布了突破性的更改之后,我们所有的“DBNull”检查都失败了(见下面的注释)。您需要在下面添加额外的位:
if (oraParam[7] == null ||
oraParam[7].Value == DBNull.Value ||
((INullable)oraParam[7].Value).IsNull)
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
INullable位于Oracle.DataAccess.Types命名空间中。ODP.NET在值为NULL时返回“NULL”字符串[ID 968857.1]
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
在本文件中
症状
变化
原因
解决方案
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
适用于:
用于.NET的Oracle数据提供程序-版本:10.2.0.2.20至11.1.0.7.10
Microsoft Windows(32位)
Microsoft Windows x64(64位)
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
症状
从早期版本的Oracle Data Provider for.NET迁移后,检索的空值的行为可能会发生变化。虽然应用程序以前返回了一个空字符串,但现在获得了一个值为“null”的字符串。
变化
从1.x ODP.NET迁移到2.x ODP.NET
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
原因
此行为是由于从.NET的1.x Oracle数据提供程序迁移到2.x提供程序所致。2.x ADO.NET支持提供程序返回特定于提供程序的类型,这是从.NET 1.x到2.x的潜在“突破性更改”之一
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
ODP.NET版本9.2.x、10.1.x、10.2.0.1.0都是1.x框架提供程序。通常,当从早期版本的ODP迁移到较新版本的ODP时,会注意到这种行为,但同时会从1.x提供程序迁移到2.x提供程序。导致这种行为的是.NET framework支持的更改,而不是Oracle客户端版本的更改
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
在将应用程序迁移到64位操作系统时也可能会注意到这种行为,因为没有1.x 64位框架
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
解决方案
要解决此行为,需要修改代码
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
作为一种解决方法,使用ODP.NET for 1.x(例如1.111.7.0而不是2.111.7.0)将导致前面的行为,但请注意,1.x提供程序在除1.x之外的任何framework版本上都没有测试或支持,并且11.1.0.7.0之后的任何版本都不计划支持1.x
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
如果操作系统是64位的,则需要强制应用程序在SYSWOW64子系统(即32位)下运行,以便使用1.x ODP.NET
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
要更正代码,请执行以下操作:
如果该值是DbType,则可以检查param.value==DbNull.value
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
如果该值是OracleDbType,则可以检查((INullable)param.value)。IsNull,因为Oracle类型继承INullable接口。或者您可以尝试
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
(OracleString)result == OracleString.Null
所以问题是什么?除了“根据
DBNull
和null
检查值”之外,您还希望有人说些什么吗?谢谢!刚刚将一个旧的.NET站点更新到4.7,这让我很头疼。对于VB:如果不是CType(cmd.Parameters(“paramName”)?.Value,不可使用)。则为null