次の方法で共有


Oracle Database アダプターに関する操作上の問題のトラブルシューティング

Microsoft BizTalk Adapter for Oracle Database の使用で発生する可能性がある操作エラーを解決するためのトラブルシューティング手法。

トレースを有効にする

Oracle データベース アダプターでのトレースのサポートについては、Oracle データベース アダプターの 診断トレースとメッセージ ログを参照してください

既知の問題

Oracle データベース アダプターの使用時に発生する可能性のある最も一般的なエラーと、その原因と解決策を次に示します。

アダプター バインドの読み込み中にエラーが発生しました

問題

Add Adapter Service Reference Visual Studio プラグインまたは Consume Adapter Service 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 クライアント ライブラリは、1 つのエンタープライズ アプリケーションに対してのみインストールできます。 その結果、GUI は他のアダプターのバインディングの読み込みに失敗します。

    解決策

  • BizTalk アダプター パックをインストールしたコンピューターに、必要な LOB クライアントのバージョンがインストールされていることを確認します。 サポートされている基幹業務 (LOB) システムとエンタープライズ システムには、 サポートされているクライアント のバージョンが一覧表示されます。

  • 必要なアダプターのみをインストールするには、必ずアダプターのカスタム・インストールを行ってください。

    アプリケーションが最新バージョンの ODP.NET で動作することを確認するには、コンピューターに "ポリシー DLL" がインストールされ、GAC に登録されている必要があります。 詳細については、Oracle の Web サイトの 「Oracle Data Provider for .NET 」を参照してください。

Oracle データベース アダプターが BizTalk Server 管理コンソールのアダプターの一覧に表示されない

問題

BizTalk アダプター パックに含まれる Oracle データベース アダプターは、BizTalk Server 管理コンソールのアダプターの一覧に表示されません。

原因

Oracle データベース アダプターは、WCF カスタム バインドです。 そのため、BizTalk Server 管理コンソールには WCF-Custom アダプターが表示されますが、WCF カスタム バインドは表示されないため、WCF ベースの Oracle データベース アダプターは表示されません。

解決策

BizTalk Server 管理コンソールへの Oracle データベース アダプターの追加に関する記事で説明されている手順に従って、 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 パラメーターを設定します。 これは、次の 2 つの方法のいずれかで設定できます。

  • サービス クラスの 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 Database の 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>

上記の形式では、操作名はスキーマの生成中に選択した操作によって制御されます。 たとえば、テーブルに対する挿入操作のスキーマを生成した場合、アクションの操作名は "挿入" になります。 ただし、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 シナリオでは必要ありません。 そのため、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 値が含まれます。 そのため、スキーマの検証は失敗します。

解決策

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などの既定の名前のみを使用します。ただし、Consume Adapter Service アドインによって生成されるバインド ファイルでは、操作名はメタデータを生成する 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 内で Oracle 数値データ型または弱く型指定された REF CURSORS に大きな値を指定したとき、それが対応する .NET 型に収まらない場合に発生します。

解決策

DataSets 内または弱く型指定された REF CURSORS 内の Oracle 数値データ型に大きな値を渡す場合は、 EnableSafeTyping バインド プロパティの値を true に設定して、安全な型指定を有効にする必要があります。 安全な型指定を有効にすると、DataSets 内の Oracle 数値データ型または弱く型指定された REF CURSORS が文字列として公開されます。

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. エラーで参照されているルード ノードを右クリックし、[ プロパティ] を選択します。

  2. 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 Database アダプター バインド ( 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 アプリケーションで通知スキーマを使用する必要がある場合は、1 つの通知スキーマを含むアプリケーションを作成し、BizTalk Server の他のすべてのアプリケーションの通知スキーマを使用します。

トランザクション受信操作でアダプターを使用すると、メモリ使用量とスレッド数が増加する

問題

ポーリングなどのトランザクション受信操作では、 ポーリング対象のテーブルに使用可能なデータがなく 、アダプターがポーリングを続行する場合、一定期間にわたってメモリ使用量とスレッド数が増加します。

原因

ポーリング対象のテーブルに使用可能なデータがない場合、受信タイムアウト サイクルのたびに、Windows Communication Foundation (WCF) によって新しいスレッドが生成され、ポーリング操作が続行されます。 そのため、スレッド数とメモリ使用量は一定期間にわたって増加します。 ただし、ポーリング対象のテーブルに何らかのデータがある場合、同じスレッドは後続のすべてのポーリングを実行し続けます。

解決策

ReceiveTimeout を最大値 (24.20:31:23.64700000 (24 日) に設定して、新しいスレッドが 24 日ごとに生成されるようにすることをお勧めします。 これにより、メモリ使用量とスレッド数があまり早くなりすぎないようにします。

SqlAdapterInboundTransactionBehavior が設定されている場合は、TransactionTimeout も最大値 (24.20:31:23.64700000 (24 日) に構成されていることを確認します。 この回避策を使用する場合は、トランザクション分離レベルを構成する必要がある場合にのみ、SqlAdapterInboundTransactionBehavior を追加できます。 それ以外の場合は、その動作を削除することをお勧めします。

ReceiveTimeout バインド プロパティの詳細については、「Oracle Database アダプターのバインド プロパティの読み取り」を参照してください。 バインド プロパティを指定する手順については、「 Oracle Database のバインド プロパティを構成する」を参照してください。

BizTalk Server でアダプターを使用する場合、タイムアウトを大きな値に設定しても、アダプターの機能には影響しません。

こちらもご覧ください

Oracle データベース アダプターのトラブルシューティング Oracle データベース アダプターのインストールに関する問題のトラブルシューティング