Oracle Database アダプターに関する運用上の問題のトラブルシューティング
Microsoft BizTalk Adapter for Oracle Database を使用して発生する可能性がある操作エラーを解決するためのトラブルシューティング手法。
トレースを有効にする
Oracle Database アダプターでのトレース サポートの詳細については、「Oracle Database アダプターの 診断トレースとメッセージ ログ」を参照してください。
の既知の問題
Oracle Database アダプターを使用するときに発生する可能性のある最も一般的なエラーと、その考えられる原因と解決策を次に示します。
アダプター バインドの読み込み中にエラーが発生しました
問題
アダプター サービス参照 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 クライアント ライブラリは、1 つのエンタープライズ アプリケーションに対してのみインストールできます。 その結果、GUI は他のアダプターのバインドの読み込みに失敗します。
解決策
BizTalk アダプター パックをインストールしたコンピューターに、必要な LOB クライアントのバージョンがインストールされていることを確認します。 サポートされている基幹業務 (LOB) およびエンタープライズ システムには、 サポートされているクライアント バージョンが一覧表示されます。
必要なアダプターのみをインストールするには、必ずアダプターのカスタム インストールを行ってください。
Note
アプリケーションが最新バージョンの ODP.NET で動作することを確認するには、コンピューターに "ポリシー DLL" がインストールされ、GAC に登録されている必要があります。 詳細については、Oracle の Web サイトの 「Oracle Data Provider for .NET 」を参照してください。
Oracle データベース アダプターが、管理コンソールのアダプターの一覧BizTalk Server表示されない
問題
BizTalk アダプター パックに含まれる Oracle Database アダプターは、BizTalk Server管理コンソールのアダプターの一覧に表示されません。
原因
Oracle Database アダプターは、WCF カスタム バインドです。 そのため、BizTalk Server管理コンソールには WCF-Custom アダプターが表示されますが、WCF カスタム バインドは表示されないため、WCF ベースの Oracle Database アダプターは表示されません。
解像度
oracle Database アダプターを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
設定することで修正できます。 これは、次の 2 つの方法のいずれかで設定できます。
このパラメーターを設定するには、サービス クラスの
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 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>
上記の形式では、操作名はスキーマの生成中に選択した操作によって制御されます。 たとえば、テーブルに対する 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 Database アダプターを使用して ReadLOB 操作を実行すると、Oracle データベースからの応答が Web サービス記述言語 (WSDL) に対する検証に失敗します。
原因
WSDL には、サービス ベースの要求の実行に定義されている StreamBody ノード名が含まれていますが、BizTalk シナリオでは必要ありません。 そのため、StreamBody ノードを含まない出力 XML を 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" />
Note
readLOB 操作は、BizTalk Serverではサポートされていません。 テーブルの選択操作を使用して、BizTalk Server ソリューションから LOB データを読み取る必要があります。
ポーリング シナリオでスキーマの検証が失敗する可能性がある
問題
スキーマの検証は、Oracle Database アダプターが ROWID または UNROWID 型のフィールドを含むデータベース テーブルをポーリングするシナリオで失敗します。
原因
デザイン時に、アダプターが ROWID 型または UNROWID 型のフィールドを含むテーブルのメタデータを生成すると、スキーマには "nillable=false" が含まれます。つまり、ROWID 型または UNROWID 型のフィールドを null にすることはできません。 ただし、実行時にアダプターがメタデータを取得すると、ROWID 型または UNROWID 型のフィールドには null 値が含まれます。 そのため、スキーマの検証は失敗します。
解決策
BizTalk Serverで Oracle Database アダプターを使用している場合は、スキーマの検証を無効にすることもできます。 または、ROWID データ型と UNROWID データ型の "nillbale=true" を変更するようにスキーマを手動で編集することもできます。
レコード型をパラメーターとして使用してストアド プロシージャを実行する場合の '不合理な変換要求' エラー
原因
Oracle ストアド プロシージャがレコード型をパラメーターとして受け取るシナリオを考えてみましょう。 レコード型がテーブル名>%ROWTYPE として<宣言されており、テーブルに LONG データ型の列があるとします。 Oracle Database アダプターは、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 内の Oracle 数値データ型に大きな値を指定した場合、またはそれぞれの .NET 型に収まらない弱い型の REF CURSORS を指定した場合に発生します。
解決策
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).
解像度
エラーで参照されているルード ノードを右クリックし、[プロパティ] を選択 します。
RootNode TypeName プロパティの場合は、無効な文字や予約語 (ドット (.) など) を削除します。
Visual Studio でアダプターを使用するときのバインド警告が無効です
問題
アダプターを使用して Visual Studio 2013 でアプリケーションを作成し、アダプターによって生成された構成ファイル (app.config) を開くと、次のような警告が表示されます。
The element 'bindings' has invalid child element 'oracleDBBinding'. List of possible elements expected: 'basicHttpBinding, customBinding, ...
原因
この警告は、 oracleDBBinding
Oracle Database アダプター バインド () が、Windows Communication Foundation (WCF) に付属する標準のバインドではないことが原因で表示されます。
解決策
この警告は無視してかまいません。
同じアプリケーションで複数の通知スキーマを使用する場合、または同じホスト上の複数のアプリケーションで通知スキーマを使用する場合、BizTalk Serverは例外をスローします
問題
BizTalk Serverは、複数のスキーマがメッセージの種類と一致したため、アプリケーションがドキュメント仕様を見つけることができないことを示す XLANG 例外または例外をスローします。
原因
これは、次のいずれかが原因で発生します。
BizTalk Server プロジェクトに複数の Notification スキーマを生成し、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 日ごとに生成されるようにすることをお勧めします。 これにより、メモリ使用量とスレッド数が早すぎないようにします。
Note
SqlAdapterInboundTransactionBehavior が設定されている場合は、TransactionTimeout も最大値 (24.20:31:23.64700000 (24 日) に構成されていることを確認します。 この回避策を使用する場合は、トランザクション分離レベルを構成する必要がある場合にのみ、SqlAdapterInboundTransactionBehavior を追加できます。 それ以外の場合は、その動作を削除することをお勧めします。
ReceiveTimeout バインド プロパティの詳細については、「Oracle Database アダプター のバインド プロパティの読み取り」を参照してください。 バインド プロパティの指定手順については、「 Oracle Database のバインド プロパティを構成する」を参照してください。
Note
BizTalk Serverでアダプターを使用する場合、タイムアウトを大きな値に設定しても、アダプターの機能には影響しません。
参照
Oracle Database アダプターのトラブルシューティング Oracle Database アダプターのインストールに関する問題のトラブルシューティング