排查 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 (nolock) ”参数作为为 PolledDataAvailableStatement 绑定属性指定的查询的一部分,以确保即使其他事务施加了锁,也会返回数据。 有关详细信息,请参阅 数据库引擎中的 SQL 锁定

适配器无法在单个操作中使用 BizTalk Server

问题

SQL 适配器无法使用 BizTalk Server 在单个操作中插入、更新或删除大量数据。

原因

插入、更新或删除大量数据可能需要一段时间,并且执行操作的 SQL 适配器或事务可能会超时。

分辨率

  • 对于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的计算机上进行此更改。 在摘录中,将 computer_name> 替换为<运行适配器客户端和SQL Server的计算机的名称。

    3. 将 SQL 适配器的 SendTimeout 绑定属性设置为相当大的值。 有关如何设置绑定属性的说明,请参阅 配置 SQL 适配器的绑定属性

对于包含数据集的响应消息,BizTalk Server中的完整架构验证失败

问题

对于返回包含数据集的响应消息的操作(例如 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 属性,请删除任何非法字符或保留字,例如 dot (.) 。

适配器无法使用临时表生成强类型存储过程的元数据

问题

适配器无法为其定义中包含临时表的强类型存储过程生成元数据。 适配器提供以下异常。

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 适配器SQL Server适配器绑定属性的信息。 有关指定绑定属性的说明,请参阅 配置 SQL 适配器的绑定属性

注意

使用具有BizTalk Server的适配器时,将超时设置为较大值不会影响适配器的功能。

另请参阅

SQL 适配器疑难解答