用于解决您在使用 Microsoft BizTalk 适配器(适用于 Oracle 数据库)时可能遇到的操作错误的故障排除技术。
启用跟踪
有关 Oracle 数据库适配器中的跟踪支持的信息,请参阅 Oracle 数据库适配器的诊断跟踪和消息日志记录。
已知问题
以下是使用 Oracle 数据库适配器时可能会遇到的最常见错误,以及其可能的原因和解决方法。
加载适配器绑定时出错
问题
尝试启动“添加适配器服务引用 Visual Studio 插件”或“使用适配器服务 BizTalk 项目外接程序”时,会收到以下错误:
There was an error loading the binding, <binding name>, from your system configuration.
ConfigurationErrorsException: Exception has been thrown by the target of an invocation.
原因
尝试启动“添加适配器服务引用插件”或“使用适配器服务插件”时,WCF 会加载所有已安装适配器的适配器绑定。 反过来,适配器绑定依赖于企业应用程序的特定客户端软件。 由于以下一个或两个原因,可能会遇到此问题:
未在安装了适配器的计算机上安装所需的 LOB 客户端软件。
你执行了适配器的典型安装或完整安装,该适配器安装 BizTalk 适配器包中包含的所有适配器。 但是,只能为一个企业应用程序安装 LOB 客户端库。 因此,GUI 无法加载其他适配器的绑定。
解决方案
请确保在安装了 BizTalk 适配器包的计算机上安装所需的 LOB 客户端版本。 支持的业务线(LOB)和企业系统 列出了支持的客户端版本。
请确保执行适配器的自定义安装,以便仅安装所需的适配器。
注释
若要确保应用程序适用于最新版本的 ODP.NET,必须在计算机上安装“策略 DLL”并在 GAC 中注册。 有关详细信息,请参阅 Oracle 网站上的 用于 .NET 的 Oracle 数据提供程序 。
Oracle 数据库适配器不显示在 BizTalk Server 管理控制台中的适配器列表中
问题
BizTalk 适配器包中包含的 Oracle 数据库适配器在 BizTalk Server 管理控制台的适配器列表中未列出。
原因
Oracle 数据库适配器是 WCF 自定义绑定。 因此,尽管 BizTalk Server 管理控制台显示 WCF-Custom 适配器,但它不显示 WCF 自定义绑定,因此不会显示基于 WCF 的 Oracle 数据库适配器。
解决方案
可以按照 将 Oracle 数据库适配器添加到 BizTalk Server 管理控制台中所述的步骤,将 Oracle 数据库适配器显式添加到 BizTalk Server 管理控制台。
检索超过 65,536 个节点的 XML 输出时出错
问题
当检索的 XML 输出超过 65,536 个节点时,适配器会提供以下错误。
Maximum number of items that can be serialized or deserialized in an object graph is '65536'.
Change the object graph or increase the MaxItemsInObjectGraph quota.
原因
适配器无法序列化和反序列化包含 65,536 个以上的项的对象。
解决方案
可以通过设置 maxItemsInObjectGraph
参数来解决此问题。 可以通过以下两种方式中的任意一种进行设置:
通过在服务类的属性
ServiceBehavior
中更改maxItemsInObjectGraph
参数来设置此参数。将以下内容添加到应用程序的 app.config 文件中。
<behaviors> <endpointBehaviors> <behavior name="NewBehavior"> <dataContractSerializer maxItemsInObjectGraph="65536000" /> </behavior> </endpointBehaviors> </behaviors>
示例 app.config 如下所示。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="NewBehavior">
<dataContractSerializer maxItemsInObjectGraph="65536000" />
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint behaviorConfiguration="NewBehavior" binding="oracleDBBinding"
contract="IOutboundContract" name="oracle_ICalculator" />
</client>
</system.serviceModel>
</configuration>
对 Oracle 数据库执行作时出错
问题
使用 BizTalk Server 对 Oracle 数据库执行任何作时,适配器会给出以下错误。
对于 BizTalk Server
System.ArgumentNullException: Value cannot be null.
原因
未指定消息的 WCF 操作。 WCF 要求为每个操作指定一个 SOAP 操作,该操作通知适配器要对 LOB 系统执行的操作。
解决方案
在发送端口中指定 SOAP 操作,或在 BizTalk 流程中将其作为消息上下文属性。 有关说明,请参阅 配置 Oracle 数据库的 SOAP 操作。 请参阅 消息和消息架构,查看每个操作的动作列表。
由于指定的操作中操作名称不正确,发生了XmlReaderParsingException
问题
BizTalk Server 管理控制台在向 Oracle 数据库发送消息时出现以下错误:
Microsoft.ServiceModel.Channels.Common.XmlReaderParsingException: Invalid argument:
<BtsActionMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Operation Name="<operation_name>" Action="<action>" />
</BtsActionMapping>
原因
如果通过导入适配器服务 BizTalk 项目插件创建的端口绑定文件来配置 WCF-Custom 端口,则端口中的动作使用以下格式指定:
<BtsActionMapping>
<Operation Name="Op1" Action="http://MyService/Svc/Op1" />
</BtsActionMapping>
在上述格式中,操作名称由你在生成模式时选择的操作控制。 例如,如果为表中的 Insert 操作生成架构,则操作名称将为“Insert”。 但是,在 Visual Studio 的 BizTalk 业务流程中创建的逻辑端口中的操作名称可能会有所不同。
解决方案
确保逻辑端口(在 Visual Studio 中的 BizTalk 业务流程)和物理端口(在 BizTalk Server 管理控制台中)的操作名称相同。
在 BizTalk 中为 WCF-Custom 端口指定连接 URI 时出错
问题
在指定要连接到 Oracle 数据库的连接 URI 时,BizTalk Server 会提供以下错误。
Error saving properties.
(System.ArgumentException) The specified address is invalid.
(System.ArgumentException) Invalid address;
"<connection URI>" is not a well-formed absolute uri.
原因
连接 URI 不符合标准编码格式。 例如,参数的值可能包含空格。
解决方案
请确保指定的连接 URI 符合标准编码格式。 例如,空格必须替换为“%20”。
调用采用 REF CURSOR 参数的存储过程时,游标异常无效
问题
在调用带有 REF CURSOR 输入的 Oracle 数据库存储过程时,可能会遇到以下异常:
Microsoft.ServiceModel.Channels.Common.TargetSystemException: ORA-01001: invalid cursor ---> Oracle.DataAccess.Client.OracleException
原因
要调用的过程的 PL/SQL 块可能会将 REF CURSOR 进行管道化处理,也就是说,IN REF CURSOR 可能会被分配给 OUT REF CURSOR。
解决方案
PL/SQL 块在没有正确处理的情况下,不得直接将 IN 传递给 OUT REF CURSOR。
使用 BizTalk Server 验证 ReadLOB 操作的响应时发生错误
问题
在将 Oracle 数据库适配器与 BizTalk Server 配合使用执行 ReadLOB作时,Oracle 数据库的响应无法对 Web 服务描述语言(WSDL)进行验证。
原因
WSDL 包含一个 StreamBody 节点名称,该名称是为执行基于服务的请求而定义的,但 BizTalk 方案不需要。 因此,当输出 XML(不包含 StreamBody 节点)与 WSDL 进行比较时,验证将失败。
解决方案
根据 BizTalk Server 生成的输出进行验证时,从 WSDL 中删除 StreamBody 节点。 请执行以下步骤:
包含 StreamBody 节点的 WSDL 如下所示。
<xs:element name="ReadLOBResponse"> <xs:annotation> <xs:documentation> <doc:action xmlns:doc="http://schemas.microsoft.com/servicemodel/adapters/metadata/documentation">http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/TBL_ALL_DATATYPES/ReadLOB/response\</doc:action> </xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element minOccurs="1" maxOccurs="1" name="ReadLOBResult" nillable="true" type="ns3:StreamBody" /> </xs:sequence> </xs:complexType> </xs:element>
将前面的代码替换为以下内容。
<xs:element name="ReadLOBResponse"> <xs:annotation> <xs:documentation> <doc:action xmlns:doc="http://schemas.microsoft.com/servicemodel/adapters/metadata/documentation">http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/TBL_ALL_DATATYPES/ReadLOB/response\</doc:action> </xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element minOccurs="1" maxOccurs="1" name="ReadLOBResult" type="xs:base64Binary" /> </xs:sequence> </xs:complexType> </xs:element>
在此步骤中,删除了原始 XSD 中 type=“ns3:StreamBody”的引用,并将其替换为 type=“xs:base64Binary”。 此外,还从原始 XSD 中删除了 nillable="true" 值。
从 WSDL 中删除以下内容。
<xs:complexType name="StreamBody"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="1" name="Stream"> <xs:simpleType> <xs:restriction base="xs:base64Binary"> <xs:minLength value="0" /> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> <xs:element name="StreamBody" nillable="true" type="ns3:StreamBody" />
注释
BizTalk Server 不支持 ReadLOB 操作。 应使用表选择操作从 BizTalk Server 解决方案中读取 LOB 数据。
在轮询场景中,模式验证可能失败
问题
在 Oracle 数据库适配器轮询包含 ROWID 或 UNROWID 类型的字段的数据库表的情况下,架构验证失败。
原因
在设计时,当适配器为包含 ROWID 或 UNROWID 类型的字段的表生成元数据时,架构包括“nillable=false”,这意味着 ROWID 或 UNROWID 类型的字段不能为 null。 但是,在运行时,适配器检索元数据时,ROWID 或 UNROWID 类型的字段包含 null 值。 因此,架构验证失败。
解决方案
如果将 Oracle 数据库适配器与 BizTalk Server 配合使用,可以选择禁用架构验证。 或者,可以手动编辑架构以更改 ROWID 和 UNROWID 数据类型的“nillbale=true”。
使用记录类型作为参数执行存储过程时出现“请求的不合理转换”错误
原因
假设 Oracle 存储过程采用记录类型作为参数。 假设记录类型声明为 <表名>%ROWTYPE,其中表具有 LONG 数据类型的列。 当 Oracle 数据库适配器遇到 LONG 数据类型时,它将数据类型的大小设置为等于 为 LongDatatypeColumnSize 绑定属性指定的值。 但是,Oracle 数据库未定义 LONG 数据类型的大小。 因此,当适配器调用存储过程时,会导致“请求的不合理的转换”错误。
解决方案
如果记录类型具有 LONG 数据类型,则必须将其显式定义为包的一部分。
即使使用 Consume Adapter Service 加载项生成的绑定文件来创建端口,适配器也无法识别物理端口上的动作。
问题
使用消费适配器服务外接程序为 Oracle 数据库中的某个特定操作生成架构后,外接程序还会创建一个端口绑定文件。 可以使用 BizTalk Server 管理控制台导入此绑定文件,以在 BizTalk Server 中创建物理端口。 但是,使用此类端口将消息发送到 Oracle 数据库时,适配器无法理解在端口上指定的作,并给出类似于以下内容的错误:
Microsoft.ServiceModel.Channels.Common.UnsupportedOperationException: Incorrect Action
<BtsActionMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Operation Name="<op_name>" Action="<action>" />
</BtsActionMapping>. Correct the specified Action, or refer to the documentation on the allowed formats for the Actions.
原因
在 BizTalk 业务流程中创建逻辑端口时,您可以为这些端口上的操作指定特定名称,或者只使用默认名称(如 Operation_1、Operation_2 等)。但是,在由适配器服务加载项生成的绑定文件中,操作名称与生成元数据的 Oracle 数据库操作名称相同。 例如,如果在 Oracle 数据库中的 ACCOUNTACTIVITY 表上为 Select 操作生成元数据,该操作将设置为以下内容:
<Operation Name="Select" Action="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY/Select" />
当导入绑定文件时,将相同的操作设置在物理端口上。 因此,逻辑端口(Operation_1、Operation_2等)上的作名称与物理端口的作中指定的作名称不匹配,从而导致错误。
解决方案
请确保逻辑端口中的操作名称与物理端口中作为操作一部分指定的操作名称相同。 执行下列操作之一:
将 BizTalk 业务流程中逻辑端口中的操作名称从 Operation_1 等更改为生成元数据的对应操作,例如 Select。
将物理端口上的操作名称更改为逻辑端口中的操作名称。 例如,您可以更改物理端口中的操作,如下所示:
<Operation Name="Operation_1" Action="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY/Select" />
适配器在执行作时引发溢出异常(“System.OverflowException”)
问题
使用适配器时,如果尝试在 DataSet 或类型较弱的 REF CURSORS 内执行包含 Oracle 数字数据类型的操作,适配器可能会引发溢出异常。
原因
如果为 DataSets 中的 Oracle 数字数据类型提供较大值,或者为无法适应相应 .NET 类型的弱类型 REF CURSORS 提供较大值,就会出现这种情况。
解决方案
如果要在 DataSets 或弱类型 REF CURSORS 中传递 Oracle 数值数据类型的大值,则必须通过将 EnableSafeTyping 绑定属性的值设置为 true 来启用安全键入。 启用安全键入会将 DataSet 或弱类型的 REF CURSORS 中的 Oracle 数值数据类型公开为字符串。
BizTalk 项目中的 RootNode TypeName 错误
问题
在 Visual Studio 中的一个 BizTalk 项目中,如果从"使用适配器服务"附加组件生成的架构包含 RootNode TypeName 属性的无效字符或保留字,那么在编译项目时会发生以下错误:
Node <node reference> - Specify a valid .NET type name for this root node.
The current .NET type name of this root node is invalid (it is a reserved BizTalk Keyword or is an invalid C# identifier).
解决方案
右键单击错误中引用的 rood 节点,然后选择“ 属性”。
对于 RootNode TypeName 属性,请删除任何非法字符或保留字,例如点(.)。
在 Visual Studio 中使用适配器时绑定警告无效
问题
使用适配器在 Visual Studio 2013 中创建应用程序并打开适配器生成的配置文件(app.config),会看到如下所示的警告:
The element 'bindings' has invalid child element 'oracleDBBinding'. List of possible elements expected: 'basicHttpBinding, customBinding, ...
原因
出现此警告是因为 Oracle 数据库适配器绑定 oracleDBBinding
不是 Windows Communication Foundation (WCF)附带的标准绑定。
解决方案
可以放心地忽略此警告。
如果在同一应用程序中使用多个通知架构,或者在同一主机上的多个应用程序中使用通知架构,BizTalk Server 将引发异常
问题
BizTalk Server 会引发 XLANG 异常或提示应用程序无法定位文档规范,因为多个架构与消息类型匹配。
原因
发生此情况的原因有以下任一:
已在 BizTalk Server 项目中生成了多个通知架构,将其部署到 BizTalk Server 应用程序,然后运行应用程序以接收来自 Oracle 数据库的通知。 由于通知架构很常见,因此在 BizTalk Server 应用程序中部署的架构之间存在冲突。
对于多个项目,你已为每个 BizTalk Server 项目生成通知架构,将每个项目部署到同一主机上的单独 BizTalk Server 应用程序,然后运行应用程序或应用程序以从 Oracle 数据库接收通知。 由于可以在 BizTalk Server 中的应用程序中访问架构和程序集,因此在各种 BizTalk Server 应用程序和程序集下部署的常见架构之间存在冲突。
解决方案
对 BizTalk Server 应用程序使用单个通知架构文件。 如果需要在同一主机上的多个 BizTalk Server 应用程序中使用通知架构,请创建一个包含单个通知架构的应用程序,然后使用 BizTalk Server 中所有其他应用程序的通知架构。
在事务处理入站作中使用适配器时,内存使用率和线程计数增加
问题
在一个已处理的入站操作中(例如轮询),如果在被轮询的表中没有可用数据,并且适配器继续轮询,随着时间的推移,您会发现内存使用量和线程计数增加。
原因
如果表中没有可供轮询的数据,则每次接收超时周期后,Windows Communication Foundation(WCF)都会启动一个新线程以继续轮询操作。 因此,线程计数和内存使用量会在一段时间内增加。 但是,如果正在轮询的表具有一些数据,则同一线程将继续执行所有后续轮询。
解决方案
建议将 ReceiveTimeout 设置为最大可能值,即 24.20:31:23.6470000 (24 天),以便仅每隔 24 天生成一个新线程。 这将确保内存使用率和线程计数不会过快增长。
注释
如果已设置 SqlAdapterInboundTransactionBehavior,请确保 TransactionTimeout 也配置为最大可能值,即 24.20:31:23.6470000(24 天)。 使用此解决方法时,仅当必须配置事务隔离级别时,才能添加 SqlAdapterInboundTransactionBehavior。 否则,最好删除该行为。
有关 ReceiveTimeout 绑定属性的详细信息,请参阅 有关 Oracle 数据库适配器绑定属性的信息。 有关指定绑定属性的说明,请参阅 配置 Oracle 数据库的绑定属性。
注释
将适配器与 BizTalk Server 配合使用时,将超时设置为较大的值不会影响适配器的功能。