排查 Oracle 数据库适配器的操作问题

解决使用适用于 Oracle 数据库的 Microsoft BizTalk 适配器时可能会遇到的操作错误的故障排除技术。

启用跟踪

有关 Oracle 数据库适配器中的跟踪支持的信息,请参阅 Oracle 数据库适配器的诊断跟踪和消息日志记录

已知问题

以下是使用 Oracle 数据库适配器时可能会遇到的最常见错误及其可能的原因和解决方法。

加载适配器绑定时出错

问题

尝试启动“添加适配器服务引用”Visual Studio插件或“使用适配器服务 BizTalk”Project外接程序时,会出现以下错误:

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) 和Enterprise系统列出了支持的客户端版本。

  • 请确保执行适配器的自定义安装,以便仅安装所需的适配器。

    注意

    若要确保应用程序适用于最新版本的 ODP.NET,必须在计算机上安装“策略 DLL”并在 GAC 中注册。 有关详细信息,请参阅 Oracle 网站上的 适用于 .NET 的 Oracle 数据提供程序

Oracle 数据库适配器不会显示在BizTalk Server管理控制台中的适配器列表中

问题

未在 BizTalk Server 管理控制台中的适配器列表中列出 BizTalk 适配器包的 Oracle 数据库适配器。

原因

Oracle 数据库适配器是 WCF 自定义绑定。 因此,尽管BizTalk Server管理控制台显示WCF-Custom适配器,但它不显示 WCF 自定义绑定,因此不会显示基于 WCF 的 Oracle 数据库适配器。

分辨率

可以按照将 Oracle 数据库适配器添加到BizTalk Server管理控制台中所述的步骤,将 Oracle 数据库适配器显式添加到BizTalk Server管理控制台。

检索超过 65,536 个节点的 XML 输出时出错

问题

当检索具有 65,536 个节点以上的 XML 输出时,适配器会提供以下错误。

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 应用程序执行的操作。

    分辨率

    在发送端口或 BizTalk 业务流程中将 SOAP 操作指定为消息上下文属性。 有关说明,请参阅 配置 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 Project 外接程序创建的端口绑定文件来配置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 时出错

问题

BizTalk Server指定连接到 Oracle 数据库的连接 URI 时,会提供以下错误。

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 操作的响应时出错

问题

使用具有BizTalk Server的 Oracle 数据库适配器执行 ReadLOB 操作时,Oracle 数据库的响应无法对 Web 服务说明语言 (WSDL) 进行验证。

原因

WSDL 包含一个 StreamBody 节点名称,该名称是为执行基于服务的请求而定义的,但 BizTalk 方案不需要。 因此,如果输出 XML 不包含 StreamBody 节点,则与 WSDL 进行比较时,验证会失败。

分辨率

根据使用BizTalk Server生成的输出进行验证时,从 WSDL 中删除 StreamBody 节点。 执行以下步骤来完成此操作:

  1. 包含 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”值。

  2. 从 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 操作。 应使用表 Select 操作从BizTalk Server解决方案读取 LOB 数据。

在轮询方案中,架构验证可能失败

问题

在 Oracle 数据库适配器轮询包含 ROWID 或 UNROWID 类型的字段的数据库表的情况下,架构验证失败。

原因

在设计时,当适配器为包含 ROWID 或 UNROWID 类型的字段的表生成元数据时,架构包含“nillable=false”,这意味着 ROWID 或 UNROWID 类型的字段不能为 null。 但是,在适配器检索元数据时,ROWID 或 UNROWID 类型的字段包含 null 值。 因此架构验证失败。

分辨率

如果对 BizTalk Server 使用 Oracle 数据库适配器,可以选择禁用架构验证。 或者,可以手动编辑架构以更改 ROWID 和 UNROWID 数据类型的“nillbale=true”。

使用记录类型作为参数执行存储过程时出现“请求的不合理转换”错误

原因

假设 Oracle 存储过程采用记录类型作为参数的情况。 假定记录类型声明为 <表名>%ROWTYPE,其中表具有 LONG 数据类型的列。 当 Oracle 数据库适配器遇到 LONG 数据类型时,它将数据类型的大小设置为等于 为 LongDatatypeColumnSize 绑定属性指定的值。 但是,Oracle 数据库未为 LONG 数据类型定义大小。 因此,当适配器调用存储过程时,会导致“请求不合理的转换”错误。

分辨率

如果记录类型具有 LONG 数据类型,则必须将其显式定义为包的一部分。

即使使用使用适配器服务加载项生成的绑定文件来创建端口,适配器也无法识别物理端口上的操作

问题

使用“使用适配器服务外接程序”为 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 数值数据类型的操作,则适配器可能会引发溢出异常。

原因

如果为数据集内的 Oracle 数字数据类型或无法适应相应 .NET 类型的弱类型 REF CURSORS 提供较大值,则会发生此情况。

分辨率

如果要在 DataSet 或弱类型 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).

分辨率

  1. 右键单击错误中引用的 rood 节点,然后选择“ 属性”。

  2. 对于 RootNode TypeName 属性,请删除任何非法字符或保留字,例如 dot (.) 。

在 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一起使用时,将超时设置为大型值不会影响适配器的功能。

另请参阅

排查 Oracle 数据库适配器的 Oracle DatabaseadapterTroubleshoot 安装问题