針對 SQL 配接器的作業問題進行疑難排解
本節討論如何使用疑難排解技術來解決您在使用 Microsoft BizTalk Adapter for 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資料庫上執行任何作業時,會提供下列錯誤。
針對 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的輪詢訊息。
原因
確認任何其他交易是否已鎖定配接器正在輪詢的資料表。
解決方法
如果您想要輪詢另一筆交易中更新的資料表,您可以考慮使用 「with with (nolock) 」 參數做為 PolledDataAvailableStatement 系結屬性所指定的查詢的一部分,以確保即使其他交易加總鎖定,也會傳回資料。 如需詳細資訊,請參閱 Database Engine 中的 SQL 鎖定。
配接器無法使用BizTalk Server,在單一作業中插入、更新或刪除大量資料
問題
SQL 配接器無法使用 BizTalk Server,在單一作業中插入、更新或刪除大量資料。
原因
插入、更新或刪除大量資料可能需要一段時間,而且執行作業的 SQL 配接器或交易可能會逾時。
解決方法
針對 BizTalk Server
在 machine.config 中指定 WCF 配接器的逾時。流覽至系統磁片磁碟機 > :\WINDOWS\Microsoft.NET\Framework\version > \ < CONFIG 底下的 < machine.config檔案,並新增類似下列的摘錄。
<configuration> <system.transactions> <machineSettings maxTimeout="02:00:00" /> </system.transactions> </configuration>
使用此設定時,WCF 配接器逾時會設定為 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。 在摘錄中,將 computer_name > 取代 < 為執行配接器用戶端的電腦名稱稱,並SQL Server。
將 SQL 配接器的 SendTimeout 系結屬性設定為相當大的值。 如需如何設定系結屬性的指示,請參閱 設定 SQL 配接器的系結屬性。
包含 DataSet 的回應訊息,BizTalk Server中的完整架構驗證失敗
問題
對於傳回包含 DataSet 的回應訊息的作業,例如 ExecuteReader,完整架構驗證會在BizTalk Server中失敗。
解決方法
建議您不要對包含資料集的回應訊息執行完整的架構驗證。 您反而可以執行下列作業︰
使用架構傳迴響應消息後,執行作業。
將架構從回應訊息複製到 .xsd 檔案,並將此檔案新增至 BizTalk 專案。
在協調流程中使用 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).
解決方法
以滑鼠右鍵按一下錯誤中所參考的 rood 節點,然後選取 [ 屬性]。
針對 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 例外狀況或例外狀況,指出應用程式找不到檔規格,因為多個架構符合訊息類型。
原因
這是因為下列任一項:
您已在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時,將逾時設定為大型值不會影響介面卡的功能。