共用方式為


針對 SQL 配接器的作業問題進行疑難解答

本節討論如何使用故障排除技巧來解決您在使用 Microsoft BizTalk Server 的 SQL Server 配接器時可能會遇到的操作錯誤。

啟用追蹤

您必須啟用配接器、WCF LOB 配接器 SDK 和 SQL Server 之間的追蹤,才能收集您在使用 SQL 配接器時遇到的任何問題的詳細資訊。 如需 SQL 配接器中追蹤支援的詳細資訊,請參閱 SQL 配接器中的診斷追蹤和訊息記錄

已知問題

以下是使用 SQL 配接器時可能會遇到的最常見錯誤,以及其可能的原因和解決方式。

載入配接器系結時發生錯誤

問題

當您嘗試啟動新增配接器服務參考 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 會載入所有已安裝配接器的適配器繫結。 接著,配接器系結會相依於企業應用程式的特定客戶端軟體。 如果您執行了一般或完整安裝,這會安裝 BizTalk 配接器套件中包含的所有配接器,您可能會遇到此問題。 不過,LOB 客戶端程式庫可能僅安裝於一個企業應用程式。 因此,GUI 無法載入其他配接器的系結。

解決方法

請確定您執行適配卡的自定義安裝,只安裝您需要的適配卡。

SQL 配接器不會顯示在 BizTalk Server 管理控制台中的配接器清單中

問題

與 BizTalk Server 隨附的舊版配接器不同,BizTalk 配接器套件隨附的 SQL 配接器不會顯示在 BizTalk Server 管理控制台中的配接器清單中。

原因

最新的 SQL 配接器是 WCF 自定義系結。 因此,雖然 BizTalk Server 管理控制台會顯示 WCF-Custom 配接器,但它不會顯示 WCF 自定義系結,因此不會顯示 WCF 型 SQL 配接器。

解決方法

您可以遵循將 SQL 配接器新增至 BizTalk Server 管理控制台中所述的步驟,明確地將 SQL 配接器新增 至 BizTalk Server 管理控制台

在 SQL Server 資料庫上執行作業時發生錯誤

問題

配接器在使用 BizTalk Server 在 SQL Server 資料庫上執行任何作業時,會提供下列錯誤。

  • For BizTalk Server

    System.ArgumentNullException: Value cannot be null.  
    

    原因

    未指定訊息的 WCF 動作。 WCF 需要為每個作業指定 SOAP 動作,以通知配接器在 LOB 應用程式上要執行的作業。

    解決方法

    在傳送埠中指定 SOAP 動作,或在 BizTalk 協調流程中指定為訊息內容屬性。 如需指示,請參閱 設定 SQL 配接器的 SOAP 動作。 請參閱 訊息和訊息架構 ,以查看每個作業的動作清單。

在執行 FILESTREAM 作業時發生 ErrorCode=5 的 InvalidOperationException。

問題

使用 SQL 配接器執行 FILESTREAM 作業時,您會收到下列錯誤。

System.InvalidOperationException: OpenSqlFileStream returned error.  
ErrorCode:5  
  

原因

您可能已指定資料庫認證來連線到 SQL Server 資料庫。 若要執行 FILESTREAM 作業,您必須一律使用 Windows 驗證。 錯誤碼 「5」 表示因為認證不正確而拒絕存取。 如需不同錯誤碼的詳細資訊,請參閱 系統錯誤碼 (0-499)

解決方法

使用 Windows 驗證連線到 SQL Server 資料庫。 在 BizTalk Server 管理控制台中,您可以將 [WCF-Custom 或 WCF-SQL 埠組態] 對話框中的使用者名稱和密碼字段保留空白,以執行此動作。

輪詢作業不會傳回任何訊息,即使已為PollingStatement和 PolledDataAvailableStatement 指定有效語句也一樣

問題

即使已為PollingStatement和 PolledDataAvailableStatement 系結屬性指定有效值,配接器也不會從 SQL Server 接收輪詢訊息。

原因

請核實是否有任何其他交易在正在被配接器輪詢的數據表上取得鎖定。

解決方法

如果您想要輪詢一個正在作為另一筆交易一部分而被更新的資料表,可以考慮在 PolledDataAvailableStatement 綁定屬性的查詢中使用 "with (nolock)" 參數,以確保即使其他交易施加鎖定,數據也能被返回。 如需詳細資訊,請參閱 Database Engine 中的 SQL 鎖定

配接器無法使用 BizTalk Server 在單一作業中插入、更新或刪除大量數據

問題

SQL 配接器無法使用 BizTalk Server 在單一作業中插入、更新或刪除大量數據。

原因

插入、更新或刪除大量數據可能需要時間,而且執行作業的 SQL 配接器或交易可能會逾時。

解決方法

  • For BizTalk Server

    1. 在 machine.config中指定 WCF 配接器的逾時。流覽至 <系統磁碟>:\WINDOWS\Microsoft.NET\Framework\<version>\CONFIG 下的 machine.config 檔案,並新增類似下列的摘錄。

      <configuration>  
       <system.transactions>  
        <machineSettings maxTimeout="02:00:00" />  
       </system.transactions>  
      </configuration>  
      

      使用此設定時,WCF 配接器逾時會設定為 2 小時。

    2. 在 machine.config中指定 MSDTC 交易的逾時設定。流覽至系統磁碟驅動器>:\WINDOWS\Microsoft.NET\Framework\version>\<CONFIG 底下的 <machine.config 檔案,並新增類似下列的摘錄。

      <system.transactions>   
              <defaultSettings distributedTransactionManagerName="<computer_name>" timeout="02:00:00"/>   
          </system.transactions>  
      
      

      使用此設定時,MSDTC 逾時會設定為 2 小時。 MSDTC 逾時的預設值為 10 分鐘。

      這很重要

      您必須在執行配接器用戶端和 SQL Server 的電腦上進行這項變更。 在摘錄中,以執行配接器用戶端和 SQL Server 的電腦名稱取代 <computer_name> 。

    3. 將 SQL 配接器的 SendTimeout 系結屬性設定為相當大的值。 如需如何設定系結屬性的指示,請參閱 設定 SQL 配接器的系結屬性

BizTalk Server 中包含 DataSet 的回應訊息完整架構驗證失敗

問題

針對傳回包含 DataSet 之回應訊息的作業,例如 ExecuteReader,BizTalk Server 中的完整架構驗證失敗。

解決方法

建議您不要對包含數據集的回應消息執行完整的架構驗證。 您反而可以執行下列作業︰

  1. 一旦傳回具有架構的回應消息,請執行作業。

  2. 將架構從回應訊息複製到 .xsd 檔案,並將此檔案新增至 BizTalk 專案。

  3. 在協調流程中使用 xpath 查詢,從回應消息擷取數據。

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 屬性,請移除任何不合法的字元或保留字,例如點 (.)。

配接器無法產生具有暫存表之強類型預存程序的元數據

問題

適配器無法為包含在定義中的臨時表的強類型預存程序生成元數據。 配接器提供下列例外狀況。

Microsoft.ServiceModel.Channels.Common.MetadataException:  
Retrieval of Operation Metadata has failed while building WSDL at 'TypedProcedure/<schema>/<stored_procedure_name>' --->  
System.Data.SqlClient.SqlException: Invalid object name '<temp_table_name>'.  
  

解決方法

SQL 配接器不支援為其定義中包含臨時表的強型別預存程式產生元數據。 相反地,您應該在使用 [新增配接器服務參考外掛模組] 或 [取用配接器服務增益集] 時,從 [ 程序 ] 節點底下產生相同程序的元數據。

在 Visual Studio 中使用配接器時無效的系結警告

問題

當您使用配接器在 Visual Studio 中建立應用程式,並開啟配接器所產生的組態檔 (app.config),您會看到類似下列的警告:

The element 'bindings' has invalid child element 'sqlBinding'. List of possible elements expected: 'basicHttpBinding, customBinding, ...  

原因

因為 SQL 配接器系結 sqlBinding不是隨附於 Windows Communication Foundation (WCF) 的標準系結,因此會出現此警告。

解決方法

您可以放心忽略這個警告。

如果您在同一個應用程式中使用多個通知架構,或在同一部主機上的多個應用程式上使用通知架構,BizTalk Server 會擲回例外狀況

問題

BizTalk Server 會擲回 XLANG 例外狀況或其他例外狀況,指出應用程式找不到文件規格,因為多個 Schema 符合訊息類型。

原因

這是因為下列任一項:

  • 您已在 BizTalk Server 專案中產生多個通知架構、將其部署到 BizTalk Server 應用程式,然後執行應用程式以接收來自 SQL Server 資料庫的通知。 由於通知架構很常見,因此在 BizTalk Server 應用程式中部署的架構之間發生衝突。

  • 如果是多個專案,您已為每個 BizTalk Server 專案產生通知架構、將每個專案部署到相同主機上的個別 BizTalk Server 應用程式,然後執行應用程式或應用程式以接收來自 SQL Server 資料庫的通知。 由於架構和元件可在 BizTalk Server 中跨應用程式存取,因此在各種 BizTalk Server 應用程式和元件下部署的通用架構之間發生衝突。

    解決方法

    針對 BizTalk Server 應用程式使用單一通知架構檔案。 如果您需要在相同主機上的多個 BizTalk Server 應用程式中使用通知架構,請建立包含單一通知架構的應用程式,然後使用 BizTalk Server 中所有其他應用程式的通知架構。

配接器用戶端在配接器用戶端與 SQL Server 資料庫之間還原連線之後,在執行作業時擲回例外狀況

問題

配接器用戶端會在 SQL Server 資料庫上執行作業時擲回下列例外狀況:

{System.Data.Common.DbException} = {"A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)"}  

原因

在執行作業期間,配接器會使用來自 SQL ADO.NET 連接集區的連線來連線到 SQL Server 資料庫,並執行作業。 如果適配卡用戶端與 SQL Server 資料庫之間有短暫的網路中斷,或 SQL Server 資料庫暫時關閉,SQL ADO.NET 連接集區中的所有連線都會變成無效。 還原連線並嘗試在 SQL Server 資料庫上執行作業之後,配接器會使用相同的來自 SQL ADO.NET 連接集區的無效連線,因此配接器用戶端會擲回例外狀況。

解決方法

配接器客戶端應該在其作業執行中實作重試邏輯,其中應該攔截例外狀況,並將作業重試計數指定為 “n+1”,其中 “n” 是 MaxConnectionPoolSize 系結屬性所指定的值。 這表示,如果連線集區中有 「n」 個連線數目已呈現無效,則從理論上,配接器客戶端應該重試最多 「n+1」 次,以取得有效的連線,因此執行作業。

例如,若要在 BizTalk Server 中指定重試計數,請在應用程式中開啟傳送埠的 [ 屬性 ] 對話框,按兩下對話框左窗格中的 [ 傳輸進階選項 ],然後在 [ 傳輸選項 ] 區域中指定 [重試計數 ] 列表中的值。

在交易的輸入作業中使用配接器時,記憶體使用量和線程計數會增加

問題

在處理輸入操作時,例如輪詢操作,如果輪詢的數據表中沒有可用數據,但配接器繼續輪詢,隨著時間推移,您會發現記憶體使用量和執行緒數量增加。

原因

如果數據表中沒有任何數據可供輪詢,在每次接收逾時周期之後,Windows Communication Foundation (WCF) 就會繁衍新的線程,以繼續輪詢作業。 因此,線程計數和記憶體使用量會在一段時間內增加。 不過,如果正在輪詢的數據表有一些數據,則相同的線程會繼續執行所有後續的輪詢。

解決方法

建議將 ReceiveTimeout 設定為最大可能值,也就是 24.20:31:23.6470000 (24 天),讓新的線程每隔 24 天才會繁衍一次。 這可確保記憶體使用量和線程計數不會太快成長。

備註

如果已設定 SqlAdapterInboundTransactionBehavior,請確定 TransactionTimeout 也設定為最大可能值,也就是 24.20:31:23.6470000 (24 天)。 使用此因應措施時,我們只有在必須設定交易隔離等級時,才能新增 SqlAdapterInboundTransactionBehavior。 否則,最好移除該行為。

如需 ReceiveTimeout 系結屬性的詳細資訊,請參閱 關於 BizTalk Adapter for SQL Server 配接器系結屬性。 如需指定系結屬性的指示,請參閱 設定 SQL 配接器的系結屬性

備註

搭配 BizTalk Server 使用配接器時,將逾時設定為大型值並不會影響配接器的功能。

另請參閱

針對 SQL 配接器進行疑難解答