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

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

启用跟踪

有关 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 输出时出错

问题

检索节点数超过 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 参数来解决此问题。 可以通过以下两种方式之一来设置此项:

  • 通过更改 maxItemsInObjectGraph 服务类的 属性中的 ServiceBehavior 参数来设置此参数。

  • 将以下内容添加到应用程序的 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 时出错

问题

BizTalk Server指定连接 URI 以连接到 Oracle 数据库时出现以下错误。

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 参数的存储过程时游标异常无效

问题

在 Oracle 数据库中调用采用 REF CURSOR 输入的过程时,可能会收到以下异常:

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 方案不需要该名称。 因此,将不包含 StreamBody 节点的输出 XML 与 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 操作。 应使用表选择操作从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 数据类型,则必须将其显式定义为包的一部分。

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

问题

在使用适配器服务外接程序为 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”)

问题

如果使用适配器,如果尝试在 DataSets 或弱类型 REF CURSORS 中执行包含 Oracle 数字数据类型的操作,适配器可能会引发溢出异常。

原因

如果在 DataSets 或弱类型 REF CURSORS 中为 Oracle 数字数据类型提供较大值,但不能容纳到相应的 .NET 类型中,则会发生此情况。

解决方法

如果要在 DataSets 或弱类型 REF CURSORS 中传递 Oracle 数字数据类型的大值,则必须通过将 EnableSafeTyping 绑定属性的值设置为 true 来启用安全键入。 启用安全类型化会将 DataSets 或弱类型 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.64700000 (24 天) 。 使用此解决方法时,仅当必须配置事务隔离级别时,我们才能添加 SqlAdapterInboundTransactionBehavior。 否则,最佳做法是删除该行为。

有关 ReceiveTimeout 绑定属性的详细信息,请参阅 阅读有关 Oracle 数据库适配器绑定属性的信息。 有关指定绑定属性的说明,请参阅 配置 Oracle 数据库的绑定属性

注意

将适配器与 BizTalk Server 配合使用时,将超时值设置为大值不会影响适配器的功能。

另请参阅

Oracle 数据库适配器疑难解答Oracle 数据库适配器的安装问题