BizTalk开发系列(二十五) SQL Adapter

时间:2021-12-09 20:56:20

  SQL Server 是.NET开发的首选数据库。当然开发BizTalk应用程序很多也离不了SQL Server.针对SQL Server的数据操作BizTalk 提供了SQL Adapter作为与数据库交互的接口。本文是一篇基础文章,一部分内容摘自BizTalk的帮助文档。主要介绍了在SQL Adapter使用过程中需要了解或掌握的相关知识。如果您已经很了解BizTalk开发的话欢迎作补充。

  SQL适配器由接收和发送适配器组成。 SQL 接收适配器是定期轮询 SQL 结果集的轮询适配器。SQL 命令存储在接收位置的配置属性中,可通过适配器架构生成向导程序调用。SQL 接收适配器支持每次运行返回单个 XML 数据格式结果集的SELECT 语句和存储过程调用。

  SQL 发送适配器,可以将动态创建的 Updategram 或动态调用的存储过程发送到 SQL Server。Updategram 为 XML 片段,用于根据数据库表和列来映射 XML 节点从而在 SQL Server 数据库中插入、更新或删除数据。在 Updategram 完成后,SQL Server 将返回可选的响应文档,其中包含状态信息以指明更新是否成功。如果在更新期间出现错误,则 SQL 适配器将引发由 BizTalk 消息引擎处理的异常。如果将 SQL 发送适配器配置为调用存储过程,则该适配器将以单一 XML 格式的记录集形式返回所有结果。

SQL架构生成向导

     新建BizTalk项目,添加生成项目。

BizTalk开发系列(二十五) SQL Adapter

在生成适配器的列表中选择SQL.

BizTalk开发系列(二十五) SQL Adapter

在数据库连接属性设置中。如果是使用数据库账户登录的话需要选择Allow saving password。否则不能通过向导。

BizTalk开发系列(二十五) SQL Adapter

  在架构信息中的目标命名空间中输入命名空间,端口类型中选择接收或发送端口。发送端口需要输入返回消息的根节点名称。

BizTalk开发系列(二十五) SQL Adapter

 在输入的SQL脚本需要使用for xml auto 或for xml auto, elements将结果以XML记录集的形式返回。

BizTalk开发系列(二十五) SQL Adapter

还可以选择存储过程。在存储过程列表中选择存储过程名称并在表格中给存储参数赋值。参数赋值的时候需要耐心点,不然一不小心就选择NULL了。

BizTalk开发系列(二十五) SQL Adapter

完成之后向导生成器就会自动生成Schema。同时也会生成带有该Schema类型的Orchestration。在Orchestration中使用Schema类型跟其他Schema(自定义或生成)的没有什么区别。这里就不介绍了。

 BizTalk开发系列(二十五) SQL Adapter     BizTalk开发系列(二十五) SQL Adapter

使用 Updategram

     通过使用 updategram ,可以从现有 XML 文档在 Microsoft SQL Server 中修改(插入、更新或删除)数据库。 有关Updategram的详细信息参见:  Updategram 简介 (SQLXML 4.0)

所有 Updategram 都包含相同的基本结构:


<InboundRootElementName>

   <sync>

      <before>

         <TableName col1='value' col2='value' />

      </before>

      <after>

         <TableName col1='value' col2='value' />

      </after>

   </sync>

</InboundRootElementName> 

以下定义描述了每个块的角色:

  • <before>。标识记录实例的现有状态(也称为“之前状态”),并充当 SQL 语句中的 WHERE 子句。
  • <after>。标识要将数据更改为的新状态。
  • <sync>。包含 <before> 块和 <after> 块。<sync>
    块可以包含多组 <before> 块和 <after> 块。如果存在多组 <before> 块和
    <after> 块,则必须成对指定这些块(即使它们为空)。此外,Updategram 可以具有多个 <sync>
    块。每个 <sync> 块都是一个事务单元(这意味着 <sync> 中的所有项都在运行,或者都没有运行)。如果在
    Updategram 中指定多个 <sync> 块,其中一个 <sync> 块出错将不会影响其他
    <sync> 块。

Updategram 是否删除、插入或更新记录实例取决于 <before> 块和 <after> 块的内容:

  • 如果记录实例只出现在 <before> 块中,而在 <after> 块中没有对应的实例,则 Updategram 将执行删除操作。
  • 如果记录实例只出现在 <after> 块中,而在 <before> 块中没有对应的实例,则执行插入操作。
  • 如果记录实例出现在 <before> 块中,并在 <after> 块中存在对应的实例,则执行更新操作。在这种情况下,<after> 块中指定的值将更新相应的记录实例。

使用添加生成的项向导,可以选择要对表执行的操作,并生成只支持该操作的架构。例如,如果选择插入操作,则架构中将仅显示
Updategram 上的 <before>
块。若要生成可用于上述任何操作的多用途架构,请从“要更新的列”列表中选择针对所有列的更新操作。然后,在根据此架构创建 XML
实例时可以选择要创建的块。

BizTalk开发系列(二十五) SQL Adapter

通过添加生成的项生成的Updategram XML架构。

BizTalk开发系列(二十五) SQL Adapter

SQL接收适配器的配置

  SQL 接收适配器只能绑定到单向接收端口,在SQL 传输属性对话框中配置需要注意:
文档根节点和目标命名空间要跟生成的Schema一致当然你也可以反过来将Schema中的命名空间和根节点调成和Adapter配置的一致再重新部署项
目。连接字符串可以通过数据链接属性配置。SQL命令可以根据现有的Schema生成或者手动输入SQL命令或存储过程。

  接收配置中的 Poll While Data
Found属性指定是在存储过程或查询未返回任何结果后才提交其他批,还是在每个轮询间隔提交一个存储过程结果或查询结果。默认为False.指的是在每
个轮询间隔提交一个存储过程结果或查询结果。Polling Interval指定轮询请求之间的单位数。Polling Unit of
Measure 指定轮询请求之间使用的度量单位。

 BizTalk开发系列(二十五) SQL Adapter

 最后要介绍一下URI,如果配置的SQL接收端口URI地址与BizTalk现有的一接收端口配置一样的话.端口配置向导会提示该位置已经被使用。但如果你必须要使用这个位置的话则可以手动在UR后面添加I标识来实现。比如:SQL://./pubs/Next

SQL发送适配器的配置

   SQL发送适配器的配置比较简单,可以绑定到单向或双向端口。同时注意命名空间、根节点与Schema的一致性。

BizTalk开发系列(二十五) SQL Adapter

SQL 适配器的最佳实践

1.优先使用存储过程,对于偶尔执行的操作可以也使用updategram 。

2.避免在接收端口中因重新提交相同数据而产生竞争。最好是在表中设置一个状态字段,以防止在长时间执行业务流程时 SQL 操作向 BizTalk Server 重新发送相同的信息。

3.使用信封消息每次返回多行。SQL 适配器接收函数将限定为只能每分钟处理 60 条消息。

4.如果消息大于 1 MB,则应考虑减少从 SQL Server 返回的行数,以使消息保持在 1 MB 以下。同时建议将连续轮询属性设置为 True,以便适配器在单独的批中只提交剩余的行。适配器提交批,直到 SQL Server 计算机返回空的结果集,此时 SQL 适配器将释放线程,直到下一个轮询间隔。

SQL 适配器已知问题和解决办法

1.接收函数返回空文档
如果 SELECT 语句或存储过程生成空结果集,则 SQL 适配器接收函数返回的文档只包含根和目标命名空间。

如果 SELECT 语句或存储过程包含 xmldata 关键字,就会出现此问题。

若要解决此问题,请删除 SQL 适配器终结点配置中 SELECT 语句或存储过程中的 xmldata 关键字。

2.向 SQL 发送适配器发送 updategram 时收到错误
向 SQL 发送适配器发送 updategram 时,可能会出现接收错误消息“从字符串向 datetime 转换时出现语法错误”。

如果 SQL 表包含日期时间列,并且 updategram 尝试用不正确的值更新该列,则会出现此问题。

若要解决此问题,请不要使用 BizTalk 映射器
functoid 创建要映射到 updategram 的日期时间值。这些 functoid
创建的日期时间值的格式为“1999-05-31T13:20:00.000-05:00”。SQL
日期时间列需要的日期时间值的格式为“1999-05-31T13:20:00.000”。请通过调用 DateTime 类的 Parse 或
ParseExact 方法,而不使用默认的日期和时间 functoid 来手动创建日期时间值。

3.在 updategram 中使用 money 数据类型列
在 SQL 适配器的添加生成的项向导生成一个 updategram 架构时,该向导会在架构中将 money 数据类型列表示为 XSD 类型 decimal。

发生此问题的原因是 SQLXML 要求 updategram 以“$123.45”的格式来传递 money 列。

若要在 updategram 中使用 money 列,请将 updategram 架构中对应于 SQL Server 中 money 列的属性从 xs:decimal 类型更改为 xs:string 类型。将数据映射到此列时,记住要包括前导美元符号。

4.编译错误:‘name’属性值无效
生成项目时,收到编译错误“‘name’属性值无效: 名称不能以 '' 字符(十六进制值 <十六进制值>)开头。file:/<文件位置>.xsd 发生错误。”。

如果 SELECT 语句或存储过程遇到要导入到添加适配器向导的非法字符(如 System.Xml.XmlConvert 类中所述),就会出现此问题。

若要纠正此错误,请修改添加适配器向导中定义的 SELECT
语句或存储过程中列出的表名称或列名称,使这些名称包含 System.Xml.XmlConvert 类所定义的合法值。有关 XmlConvert
类支持的字符的详细信息,请参阅 .NET Framework 文档中的 XmlConvert 类。

5.生成的 XML 架构中缺少列
由添加适配器向导所生成的 XML 架构中缺少列。

如果添加适配器向导无法匹配 XSD 数据类型,就会出现此问题。

若要解决此问题,请将列类型 SQL_Variant 更改为支持的数据类型。

6.SQL 传输架构生成向导在 BizTalk Server 中意外关闭
问题: 在 BizTalk Server 2006 中,尝试为 SQL 适配器发送端口生成架构时,SQL 传输架构生成向导意外关闭。如果尝试为以下 updategram 之一生成架构以更新 SQL Server 2005 中的数据库表时,就会出现此问题:

插入 updategram
更新 updategram
删除 updategram
此外,可能会收到类似以下内容的错误消息:

Failed to execute SQL Statement. Please ensure that the supplied syntax is correct. New transaction cannot enlist in the specified transaction coordinator. 

在 SQL Server 2005 中使用 SQL 传输架构生成向导查询数据库表时,可能会收到此错误消息。

原因:

当数据库表中包含以下一种数据类型的列时,就会出现此问题:

varbinary(MAX) 数据类型
varchar(MAX) 数据类型
nvarchar(MAX) 数据类型
xml 数据类型
在 BizTalk Server 中,SQL 适配器不支持这些数据类型。

解决方法:

这些数据类型是 SQL Server 2005
中新增的数据类型。当数据库表中包含其中一种数据类型的列时,请不要在 BizTalk Server 中使用 SQL
适配器向数据库表中插入数据。另外,不要在 BizTalk Server 中使用 SQL 适配器从数据库表中检索数据。

参考资料《Microsoft BizTalk Server 2006 Documentation》