我们在检查“DBNull”的输出参数时遇到问题。 Oracle存储过程或函数返回的“DBNull”值被oracle 11g客户端/ ODP.Net提供程序视为“null”字符串。这适用于oracle 10g客户端,因为它返回“DBNull”。 因此,我们所有的“DBNull”检查都失败了
答案 0 :(得分:5)
当值为空时,ODP.NET返回“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 for 1.x(例如1.111.7.0而不是2.111.7.0)将导致先前的行为,但请注意1.x提供程序未在任何版本上测试或支持除了1.x之外的其他框架,并且不计划对11x.0.7.0以后的任何版本支持1.x
如果操作系统是64位,则需要强制应用程序在SYSWOW64子系统下运行(即32位),以便使用1.x ODP.NET。
如果值是DbType,您可以检查param.Value == DbNull.Value
如果值是OracleDbType,则可以检查((INullable)param.Value).IsNull,因为Oracle Types继承了INullable接口。
答案 1 :(得分:1)
在Oracle发布了重大变化之后(请参阅下面的评论)。您需要在下面添加其他位:
if (oraParam[7] == null ||
oraParam[7].Value == DBNull.Value ||
((INullable)oraParam[7].Value).IsNull)
INullable位于Oracle.DataAccess.Types命名空间中。
答案 2 :(得分:1)
或者你可以试试......
(OracleString)result == OracleString.Null