共用方式為


針對 Oracle 資料庫配接器的作業問題進行疑難排解

疑難排解技術,以解決您使用 Microsoft BizTalk Adapter for Oracle Database 時可能會遇到的作業錯誤。

啟用追縱

如需 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 網站上的 Oracle Data Provider for .NET

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 時發生錯誤

問題

當您指定要連線到 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 作業回應時發生錯誤

問題

使用具有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 值。 因此架構驗證失敗。

解決方法

如果您使用 Oracle 資料庫配接器搭配BizTalk Server,您可以選擇停用架構驗證。 或者,您可以手動編輯架構,以變更 ROWID 和 UNROWID 資料類型的 「nillbale=true」。

以記錄類型作為參數執行預存程式時,發生「要求不合理的轉換」錯誤

原因

請考慮 Oracle 預存程式採用 Record Type 做為參數的案例。 假設 Record Type 宣告為 < 資料表名稱 > %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 資料表上產生選取作業的中繼資料,動作將會設定為下列專案:

<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 內部的 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. 以滑鼠右鍵按一下錯誤中所參考的 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 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應用程式中使用通知架構,請建立包含單一通知架構的應用程式,然後使用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 資料庫配接器的安裝問題