• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

norman

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

使用 BizTalk Adapter for SQL Server

Avanade Inc

适用于:Microsoft BizTalk Server 2004

摘要:本文档提供有关 Microsoft BizTalk Adapter for SQL Server 的常规知识。提供有关何时使用 SQL 传输数据以及如何检索、插入、更新和删除数据的建议。此外,还包括一些代码示例。

下载代码示例

本页内容

概述 概述
何时使用 Adapter for SQL Server 何时使用 Adapter for SQL Server
接收与发送 接收与发送
支持示例 支持示例
小结 小结

概述

许多 Microsoft BizTalk Server 实现都需要与数据库进行一定程度的交互以满足某些业务处理。一般情况下,这涉及查询数据库以获得信息从而进行更多的处理决策;根据消息中接收到的数据在数据库中插入或更新记录;或者定期轮询数据库获得操作所依赖的信息。当必须在 Microsoft SQL Server 数据库和 BizTalk Server 2004 之间交换数据时,有一些选项可供使用。其中的一种可用选项是 Adapter for SQL Server。

Adapter for SQL Server 对于 BizTalk 而言不是新事物。它作为 BizTalk Server 的一个外接程序引入,但现在是 BizTalk Server 2004 包含的一种默认的传输方式。除了增强早期版本的几个受欢迎的功能外,这种新版本还包含其他的功能。通过该传输,可以使用以下功能:

  • 使用 SQL 查询或存储过程,轮询数据库以检索数据。

  • 使用 Updategram 插入、更新或删除数据库中的信息。

  • 请求存储过程的响应以检索数据。

由于这种适配器能够创建现有关系数据的 XML 视图,并允许操作这些如同一条 XML 消息的数据,因此当必须在 SQL Server 和 BizTalk Server 2004 之间共享数据时,该适配器就成为一种明确的选择。

本文档讨论何时使用 Adapter for SQL Server 是一种不错的选择,探讨这种适配器的一些基本概念,然后提供在通常情况下如何使用该适配器的三个示例。

返回页首

何时使用 Adapter for SQL Server

当必须在 BizTalk Server 2004 和 SQL Server 数据库之间共享数据时,Adapter for SQL Server 是一种不错的选择。这种适配器适合于消息可大可小时的数据检索和更新情况。许多业务处理必须以一种非事务性的方式与数据库进行交互,检索或插入数据的步骤互不相关。虽然可通过事务性方式使用这种带单独工作单元的适配器(该工作单元的过程可以是事务性的),但当整个业务处理要求工作单元作为一个整体事务时,可能有更好的选择,并需要编写自定义组件来处理这种情况。

返回页首

接收与发送

Adapter for SQL Server 承担两种不同的功能,为 BizTalk 提供接收数据的方法,并为 BizTalk 提供向 SQL Server 发送数据的方法。在 BizTalk Server 帮助中,这些功能分别称为接收适配器和发送适配器。通过周期性地调用一个 SQL 命令,利用这种接收功能可从 SQL Server 检索信息。这种 SQL 命令的格式为 SELECT 语句或一个存储过程调用。然后将结果集以 XML 消息的格式提交给 BizTalk。通过存储过程调用或 Updategram 的格式,使用该发送功能将 XML 消息发送给 SQL Server。Updategram 根据 SQL Server 中数据库的列映射 XML 节点。它是表示 Updategram 的 XML 消息的结构,Updategram 决定是否插入、更新或删除数据库中的数据。调用一个存储过程可以返回一个响应文档,该文档包含 XML 消息格式的结果集。发送 Updategram 时,SQL Server 可以选择向 BizTalk 返回一个包含操作的成功状态的响应文档。

SQL 接收适配器

接收适配器作为轮询服务从 SQL Server 检索信息。使用 SQL 传输类型的接收位置有几个属性,可配置为控制该适配器的行为。SQL 命令是一种用于存储 SELECT 语句或存储过程调用的属性。然后,Adapter Framework Scheduler 以一定的间隔(由 Polling Interval 属性设置)调用该 SQL 命令。注意,接收适配器将每分钟接收消息的数量限制为 60 条。避免这种限制的一种方法是将 Poll While Data Found 属性设定为 True,这样适配器就可以不断地轮询直到每个轮询间隔中不再有要检索的数据。当确定希望的吞吐量时要牢记这一点,因为您可能必须一次返回一条消息中的多行。本文档包含的一个示例演示如何处理 SQL Server 返回的在结果集中包含多个记录的消息。接收适配器只能绑定到一个单向接收端口。

SQL 语句

将 SQL 语句用于接收适配器时,它们必须是 SELECT 语句格式。由于接收适配器是一项轮询服务并且在设计时配置 SQL 命令,因此它不能用于运行动态查询。此外,只支持 WHERE 从句中的静态值。

接收适配器使用的 SQL 语句的语法与典型的 SQL 语句略有不同。为了以 XML 消息的格式从 SQL Server 返回结果集,必须按以下方式将语法 for xml auto 或 for xml auto, elements添加到 SQL 语句末端:

SELECT * FROM Employees WHERE LastName = 'Davolio' for xml auto  

注:该适配器不支持语法 raw。

语法 xml auto 返回结果集的 XML 表示,其中,每个记录包含作为元素名的表名且每列作为属性值返回。当接收适配器发出上面的 SQL 语句时,该语句将以下面的格式返回结果集:

<root>  
<Employees EmployeeID="1" LastName="Davolio" FirstName="Nancy" …  
</root>  

在设计时设置的一种接收适配器附加属性是 Document Root Element Name。应该用在 Document Root Element Name 属性中指定的值替代上例中的根元素 。

语法 for xml auto, elements 也返回结果集的一种 XML 表示;但是,列数据作为子元素(而不是作为属性值)返回。表示由接收适配器提交所消息的架构必须反映这些差异,这一点非常重要。

存储过程

正如接收适配器支持具有静态 WHERE 子句的 SQL 语句一样,它还支持对带有静态参数值的存储过程的调用。下面是受支持的存储过程调用的一个示例:

exec [Sales by Year] @Beginning_date = '1996-06-01', @Ending_Date = '1996-07-10'

与 SQL 语句类似,适配器将以指定的轮询间隔运行 SQL 命令。因此,每个间隔适配器都将检索同样的结果集。也许这不是您想要的,具体取决于您的业务需求。使用一个存储过程时,也许以这样的方式对过程编码:标记选择的记录,也可能删除它们,这样在将来的调用中不会选择它们。下面是这种存储过程的一个示例:

CREATE PROCEDURE SubScriptionProcedure  
@Process_Date DateTime  
@Process_Date=GetDate()  
SubScription Table Set ProcessedDate=@Process_Date Where ProcessedDate is NULL  
SubscriptionId, Lastname, Firstname, MagazineName, DateOrdered 
FROM SubscriptionTable WHERE ProcessedDate=@ProcessDate FOR XML AUTO, ELEMENTS  

上面的示例首先将一个变量设置为当前的日期和时间。然后,它将 ProcessedDate 字段为空的任何记录更新为当前日期和时间。最后一步是选择 ProcessedDate 已更新的记录,该结果集就是返回到接收适配器的结果集。

注:该接收适配器不支持返回多个结果集的存储过程。但是,该适配器的确支持一个结果集中的多个记录。

存储过程必须遵循与 SQL 语句相同的语法规则以 XML 格式返回结果集。此外,这种附加的语法是 for xml auto 或 for xml auto, elements,就像上文解释的那样。

SQL 发送适配器

该发送适配器支持两种不同的功能。可以使用它将动态生成的 Updategram 发送给 SQL Server 以插入、更新或删除记录。可以选择让该适配器返回 XML 消息,该消息说明操作的成功状态。另外,可以使用该适配器来调用返回给 BizTalk 一个结果集的存储过程。调用存储过程时,任何参数均可通过 XML 消息传递。该发送适配器可绑定到一个单向发送端口,或者一个双向的请求-响应发送端口。

注:该发送适配器不支持使用 SQL 语句。调用存储过程或使用 Updategram 是唯一得到支持的选项。

Updategram

Updategram 是一种经过特殊格式化的 XML 片段,它由若干块组成,每个块实现特定的目的。正是片段内这些块的排列决定了 Updategram 是否插入、更新或删除记录。Updategram 的基本结构如下所示:

<root>  
<sync>  
<before>  
<TableName col1='value' col2='value' …/>  
</before>  
<after>  
< TableName col1='value' col2='value' …/></after>  
</sync>  
</root>  

下面描述各个块的功能:

<before>

<before>块类似于 SQL 语句中的 WHERE 子句。它根据记录当前存在状态来识别它们。

<after>

<after>块指示记录的新状态。

<sync>

<sync>块是 <before>和<after> 块的容器,并指示一个单元的事务。<sync> 块有可能包含多对<before> 与<after> 块。如果这些块中有一个出现问题,则 <sync>块中的所有内容都将回滚。Updategram 也有可能包含多个 <sync>块。由于每个 <sync>块考虑它自己的事务单元,因此它们出现问题是相互独立的。

如前所述,正是这些块的排列决定了 Updategram 是否插入、更新或删除记录。

当消息出现时只有一个<after>块而没有对应的<before> 块时,Updategram 执行插入操作。查看上面的基本结构,插入的列名和值都表示为<after> 块的属性。

当消息出现时只有一个 <before>块而没有对应的<after>块时,Updategram 执行删除操作。如前所述,<before> 块充当 SQL 语句中的 WHERE 子句。此外,查看以前的结构,任何以与属性值匹配的值显示的列均指示一个要删除的记录。

包含<before> 块以及对应的<after> 块的消息指示 Updategram 执行更新操作。此外, <before>块的行为与 WHERE 子句一样,将利用列属性的值指示的新值更新记录。

要执行多项操作,Updategram 可以有多个<sync> 块, <sync>块中还可以有多组 <before>和 <after>块。例如,使用一个 Updategram 可以插入一个采购订单记录和多个行式项目记录。这是一种强大的功能,本文的示例会演示该功能。由于性能方面的原因,如果业务过程需要对数据库表进行多项操作,最好将这些操作封装在存储过程(而不是 Updategram)中。可以优化存储过程。编译存储过程,而不是像 Updategram 那样对它们进行解释。

存储过程

除了支持 Updategram 以外,发送适配器还支持调用存储过程。除了以 XML 消息的格式返回结果集,还可以将动态参数传递给这些存储过程。这些参数作为该消息的元素或属性进行传递。返回结果集时,使用一个请求-响应发送端口调用存储过程并接受返回消息。

如前所述,必须将 for xml auto 或 for xml auto, elements 添加到存储过程以产生 XML 消息格式的结果集。

生成的项

至此,我讨论了通过使用接收适配器接收来自 SQL Server 的信息,通过使用发送适配器运行具有动态参数的存储过程或运行 Updategram。所有这一切均取决于将 XML 消息传递给 SQL Server 并可能接收一个 XML 消息格式的响应。这些 XML 消息的格式必须是特定的,手工生成它们将非常困难。幸运的是,Adapter for SQL Server 和 BizTalk 可以处理这些。

BizTalk 使您能够为项目添加生成项 (Generated Item)。通过右键单击项目并选择上下文菜单中的 Add Generated Items,可实现这一点。这让 BizTalk 根据适配器提供的参数生成一个架构。选择 Adapter for SQL Server时弹出的 SQL Transport Schema Generation Wizard 显示一些信息,例如目标命名空间、端口类型和文档根元素名称等。然后,适配器使用这些参数与 SQL Server 交互并生成一种架构,该架构反映基于所提供信息的结果集。本文档中的示例对此有详细的描述。

返回页首

支持示例

下面一节讨论本文档包含的示例。Adapter for SQL Server 不仅是支持这些示例,它们还涵盖了利用适配器能够解决的常见情况。示例包含的自述文件解释如何安装和运行示例。随后的讨论详细说明重新创建这些示例必须要遵循的步骤。

本文档中的示例使用 SQL Server 包含的 Northwind 数据库。

业务情形:Northwind 贸易商最近实现了几个企业包以处理库存控制和人力资源等。Northwind 想将这些新包与其当前基于 SQL Server 的系统集成在一起。Northwind 决定使用 BizTalk Server 2004 作为企业集成解决方案。本文档详细讨论下面的方案:

  • 问题选择 — 新 HR 系统必须能够查询存储在 SQL Server 中现有雇员的信息,以确定哪些雇员居住在特定的国家/地区。新的销售人员 (Sales Force) 自动化工具会使用该信息。这些信息必须作为 XML 消息返回(以每个雇员计)。

  • 检索新订单 — 新订单实现 (Order Fulfillment) 系统定期用新订单进行更新,这些新订单输入到现有的 SQL Server 数据库。业务要求在现有系统内生成的新订单必须在 10 分钟内迁移到订单实现系统。这些新订单发送到订单实现系统。

  • 插入新订单 — 除了现有的订单生成 (Order Generation) 系统外,新订单将由新的销售支持 (Sales Support) 系统生成。为保持系统同步,新订单以及对现有订单的更改将发送到现有的 SQL Server 数据库解决方案。这些更改将以 Updategram 的格式处理,并将由订单和订单详细信息组成。通过使用一条适用于整个事务的消息,这些消息将更新 SQL Server 中的 Order 和 Order Detail 表。

问题选择

对于这个特定的业务处理,必须能够返回到 ERP 系统雇员(这些雇员在不同的国家/地区就职)。ERP 系统针对特定国家/地区的雇员以 XML 消息格式发送请求。编排将处理该文件,使用一个请求-响应端口将 “运行存储过程”消息发送给 SQL Server,并接受 XML 消息格式的结果集。然后将结果集分解为单条消息(每个雇员记录一条消息)并发送回 ERP 系统。

开始之前,必须更新 EmployeesByCountry 存储过程。这将需要两条附加的语法,如本文档前面部分描述。首先,对于将每列 XML 映射返回到 XML 中元素的过程,必须向存储过程的末尾添加元素,以实现 XML 自动化。必须添加的其他语法是暂时的。为适配器添加一个生成项时,为了使适配器创建正确的架构,必须在现有代码的末尾添加语法 xmldata。这会告知存储过程将表示表的架构数据添加到输出。当添加一个生成项时,适配器利用这些信息生成架构。存储过程现在如下所示:

CREATE PROCEDURE EmployeesByCountry @Country nVarChar(15)   
Employees.Country, Employees.LastName, Employees.FirstName  
Employees  
Employees.Country = @Country for xml auto, elements, xmldata  

添加生成项后,将删除该过程末尾的 xmldata,原因是不希望消息中包含架构信息。

既然已将语法添加到存储过程中,即可添加表示请求和响应的架构。使用 Add Generated Items 向导并通过以下步骤创建这种架构。

添加生成项

  1. 右键单击项目,单击 Add,然后单击 Add Generated Items。

  2. 在 Add Generated Items 向导中,在第一步的 Generated Schema Files 类别下,选择 Add Adapter template,然后单击 Next。

  3. 在“Select Adapter”页上,选择SQL其他选项保留默认值,然后单击 Next。

  4. 在“Database Information”页上,单击 Set 输入连接信息。将利用这些信息创建到数据库的连接字符串。填写有关“Data Link Properties”对话框的信息,然后单击 OK。当返回到向导的“Database Information”页时,单击 Next。

    在“Schema Information”页上,输入适配器用来向架构添加一些其他信息的信息,该架构表示由 SQL Server生成的表。

    图 1 传输架构生成向导 — “Schema Information” 页

  5. 对于目标命名空间£¬将使用“http://SQLAdapterExplore.IssueSelect”。记住该值,因为在提供端口属性时将再次使用它。因为正在发送一条消息并期望有响应,所以选择 port 作为端口类型。这将允许您绑定到一个请求-响应端口。请求根元素名称将设置为 GetEmployees,而响应根元素名称将被设置为 ReturnEmployees。单击 Next。

  6. 在“Statement Type Information”页上的选项有 Updategram 或 Stored Procedure。由于要选择记录,而不是更新记录,所以选择 Procedure,然后单击 Next。

  7. 在“Statement Information”页上,选择要运行的 SQL 语句,并输入参数。

    图 2 传输架构生成向导 — “Statement Information” 页

    请注意,该图的第一列(即 Value 列)中有一个值 UK,并且已选中它的复选框。可以通过单击第一列打开文本框来设置该参数的值。为该参数输入值的原因是,存储过程基于它可以返回一个结果集,这样适配器就可以评估该存储过程,并且可以将这些列包含在表中作为响应消息的属性或元素。如果没有输入值,它就创建一个在根响应节点下带有 Success 节点的架构,将用于指示存储过程的状态。对应该示例,希望返回结果集,而不是存储过程的成功指示。

  8. 单击 Generate 让适配器评估存储过程,并生成所得到的架构,然后单击 Next。

  9. 现在完成了 Add Generated Items 向导,单击 Finish 完成。

Add Generated Items 向导在项目中创建了两个新的项。第一个项是多部分消息架构,表示对存储过程的调用和将要返回的结果集。默认情况下,该架构命名为 SQLService.xsd。可以选择将该架构重命名为更适合项目的其他名称。该架构如下所示:

图 3 SQLService.xsd 架构

请注意,GetEmployees 以前设置为请求节点,而 ReturnEmployees 以前设置为响应节点。Employees 节点名由表名决定,而子节点名由列名决定。当返回响应时,结果集中每条记录都有一个 Employees 节点。

通过 Add Generated Items 向导给项目添加的第二个项是一个新编排,默认情况下,将其命名为 BizTalk Orchestration.odx。此外,您可能想将该编排重命名为更适合项目的名称。该编排包含 Begin 和 End 形状,还有一些基于生成的架构的端口类型和多部分消息类型信息。有时根据一个编排中的 SQL 适配器,需要几个架构,或者可能想使用现有的一个编排。不必使用为您创建的默认编排。可以在生成的编排中使用端口类型和多部分消息类型作为向所选编排中添加生成架构的示例。有关这个过程的信息,请参见 BizTalk Server 2004 Help。

创建编排

如示例描述中所提到的,您希望检索就职在特定国家/地区的雇员。使用 SQL 适配器来检索 SQL Server 数据时的一种常见情况是需要处理结果集中的每条记录(作为它自己的消息)而不是处理以 XML 消息格式返回的整个结果集。有一些方法可以实现这一点,每种方法都涉及获得该消息中每条记录的句柄。在本示例包含的编排中,通过使用循环节点列表来检索每个雇员的消息。使用 XPATH 是另一种常用的解决方案,可以在 Internet 上找到很多示例。

这种情况的业务处理如下:

  1. ERP 系统为特定国家/地区的雇员发送一条请求。该请求以 XML 消息的格式发送。

  2. 该请求必须转换成可以通过 Adaptor for SQL Server 发送的消息。

  3. 返回给业务处理的结果集格式为 XML 消息。

  4. 对于返回的每位雇员,将重复下列过程:

    • 将单个雇员的 XML 记录转换成 ERP 的雇员架构。

    • 将单个 ERP 雇员消息发送给 ERP 系统。

请注意,在编排的顶部接收请求消息,然后将该消息转换成使用 Add Generated Items 向导时创建的架构的请求部分 (GetEmployees)。

图 4 编排

转换消息后,您希望通过适配器将请求消息发送给 Server,并希望通过适配器接收从 Server 返回的响应。为了实现这一点,创建一个新端口并使用请求-响应通信模式。对于通信方向,发送一条请求,并接收一个响应。响应消息的格式为使用 Add Generated Items 向导时创建的架构的响应部分 (ReturnEmployees)。

在返回包含结果集的消息后,必须要循环每条雇员记录以创建单个雇员消息并发送回 ERP 系统。

图 5 循环每条雇员记录

使用一个循环形状,让我们可以循环响应消息中的每条雇员记录。由于选择使用节点列表法来循环访问记录,因此将整个过程封装在原子范围内。这样做是因为节点列表是非序列化的。在编排中指定的表达式形状没有包含在上图中,其中有几个重要的步骤。在第一步中,响应消息被赋给一个 System.XmlDocument 类型的变量。这将使您根据 XPATH 表达式来检索节点列表,这是表达式的第二步。表达式中的最后一步是获得节点列表的计数器。这使能够通过循环形状中的 MoveNext() 语法来循环访问节点列表。

在循环形状中,根据计数器变量可以获得当前节点,每循环一次该计数器变量就增 1。然后设置消息变量,该变量代表 ERP 的雇员架构,等同于当前节点的 XML。这通过将当前节点的外部 XML 加载到 XmlDocument 并将该 XML 文档赋给消息分配形状中的消息变量来实现。单个雇员消息现在可以发送到 ERP 系统,而控制权移到下一个记录。

检索新订单

Northwind 贸易商已经实现了一种新的订单实现系统。目前,基于 Server 的现有订单实现系统仍将用来支持业务的一些区域。为了保持两个系统同步,每 10 分钟轮询一次基于 SQL Server 的系统,以检索上次轮询间隔以来的所有新订单的结果集。该结果集将以 XML 消息的格式返回。对于这个特殊的业务处理,只需要将从旧系统检索的记录发送到新系统,因此将使用基于内容的路由选择而不是编排。新的订单实现系统需要单独的订单消息。为了支持这种要求,将使用接收管道来分解入站消息,该消息代表可能包含多条记录(一个新订单一条记录)的结果集。每条记录按单独的 XML 消息存留在消息框 (MessageBox) 数据库中。

该示例将依靠 SQL 接收适配器来轮询数据库。如前所述,接收适配器支持静态的 SELECT 语句,或带有静态参数的存储过程。对于该处理,将使用一条 SELECT 语句而不是存储过程来检索记录。切记,因为每个轮询间隔都运行相同的 SELECT 语句,所以现实中希望标记或删除这些记录,这样在每个轮询间隔将不选择它们(这样的例子可以在上面 SQL 接收适配器的存储过程一节中找到)。

首先必须生成代表由接收适配器检索的订单的架构。使用 Add Generated Items 向导并按以下步骤创建该架构。

添加生成项

  1. 右键单击该项目,单击 Add,然后单击 Add Generated Items。

  2. 在向导的第一步中,在 Generated Schema Files 类别下,选择 Add Adapter template,然后单击 Next。

  3. 在“Select Adapter”页上,选择 SQL,其他选项保留默认值,然后单击 Next。

  4. 在“Database Information”页上,单击 Set 以输入连接信息。这将用于创建到数据库的连接字符串。输入有关“Data Link Properties”对话框的信息,然后单击 OK。当返回向导的“Database Information”页时,选择 Next。

  5. 在“Schema Information”页上,输入适配器用来向架构添加其他信息的信息,该架构表示由 SQL Server生成的表。对于 namespace,使用“http://SQLAdapterExplore.RetrieveNewOrders”。由于是正在接收消息,因此以 Receive port 作为端口类型。将文档根元素名称设置为 NewOrders。切记,创建 Envelop 架构时将使用这些目标命名空间和根元素名称。该窗口如下所示:

    图 6 传输架构生成向导 —“Schema Information” 页

  6. 选择 Next 移到下一步。

  7. 在“Statement Type Information”页上的选项有 Statement 或 Procedure。本例使用 Select Statement。单击 Next 继续。

  8. 下一页是“Statement Information”页。在该页上,输入每次在轮询间隔想要运行的 SELECT 语句。已经指出,将不像前面的示例一样添加 xmldata 语法。对于本例,希望选择新订单,因此将选择 Order 表中的记录以及 Order Details 表中的相关记录。SELECT 语句如下所示:

    SELECT Orders.CustomerID, Orders.EmployeeID, Orders.OrderDate, Orders.RequiredDate, 
    Orders.ShippedDate, Orders.ShipVia, Order.Freight, Orders.ShipName, Orders.ShipAddress,
    Orders.ShipCity, Orders.ShipRegion, Orders.ShipPotsalCode, Orders.ShipCountry, Details.*
    FROM Orders Orders JOIN [Order Details] Details ON Orders.OrderID = Details.OrderID
    WHERE Orders.ShippedDate IS NULL for xml auto, elements
    
  9. 单击 Next 继续。

  10. 现在已完成添加生成项过程,单击 Finish 完成。

添加生成项过程在项目中创建了两个新项。第一个项是消息架构,它表示因 SELECT 语句而返回的结果集。默认情况下,该架构命名为 SQLService.xsd。可以选择将该架构重命名为更适合项目的名称。默认情况下创建的另一个项是一个新编排,它有一个对该新架构的引用,但在其他方面是空白。不必使用该编排。由于在该示例中将使用基于内容的路由选择,因此不需要编排,并且可以将它排除在项目之外。该新架构如下所示:

图 7 新架构

请查看架构,可以发现由 SELECT 语句返回的每条记录的 Order 元素是重复的。另外,对于与某个订单相关的每个细节,Orders 表中的 Details 字段是重复的。该示例的业务要求是为每条订单记录返回一条订单消息。为了满足这种要求,将创建一个 Envelop 架构,接收管道将使用这种架构来识别什么是“包含”元素 (NewOrders)。然后,记录根据该 Envelop 分解为单个订单消息。使用下面的步骤创建 Envelop 架构。

创建 Envelop 架构

  1. 右键单击该项目,单击 Add,然后单击 Add New Item。

  2. 在右边的“Template”窗格中,选择 Schema。在 Name 框中,将架构名改为 NewOrderEnv.xsd,然后单击 Open。

  3. 在“Editor”窗口中,选择左边窗格中的 节点。在“Properties”窗口中,将“Target”命名空间设定为 http://SQLAdapterExplore.RetrieveNewOrders。在上文用添加生成项创建架构的步骤中使用了同一个命名空间。确保这些是匹配的。

  4. 将“Envelope”属性设置为 True。

  5. 右键单击“Root”节点并选择 Rename。将名称更改为 NewOrders。

  6. 通过单击椭圆型按钮 [...] 设置 NewOrders 节点的“Body XPath”属性。在上下文窗口中,选择 NewOrders 节点,然后单击 OK。

  7. 右键单击 NewOrders 节点,单击 Insert Schema Node,然后单击 Any Element。使用“Any Element”使您可以在架构中创建一个位置,该位置对应于消息中不能确定的那些元素将要出现的位置。对于该示例,将是 Orders 节点和它的所有子节点。

  8. 右键单击 节点并将“Process Contents”属性设置为“Lax”。

至此,已经配置了 Envelop 架构。为了使它能够使用表示新订单的架构,必须对 NewOrders 架构作一些更改。作为现在的架构,它表示的消息包含了所有的订单。想要实现的是每个订单的一条消息。必须更改该架构以表示这种单条订单消息。

修改该架构以表示单条订单消息

  1. 打开 NewOrders 架构。

  2. 选择 Orders 节点,并删除“Min Occurs”和“Max Occurs”属性中的任何值。

  3. 将 Orders 节点拖到 NewOrders 节点上面,直到出现一个上箭头,然后释放 Orders 节点。

  4. 删除 NewOrders 节点。

现在的架构应当如图 8 所示。

图 8 修改后的架构

现在已经完成了架构,下一步将创建引用 Envelop 架构和单个订单架构的管道。该管道将在 XML 分解阶段将 Envelop 应用于入站消息,并创建单个订单消息。

创建单个订单管道

  1. 右键单击项目,单击 Add,然后单击 Add New Item。

  2. 在上下文菜单中,选择“Template”窗格中的 Receive Pipeline。

  3. 将管道命名为 NewOrderSplit.btp,然后单击 OK。

  4. 在管道编辑器中,将 XML 分解形状拖到分解阶段。

  5. 选择 XML 分解形状,然后单击“Document”架构属性中的椭圆型按钮 [...]。在上下文菜单中,选择标记为 .SQLService(这假定没有更改过作为生成项而添加的架构的名称)的架构,然后单击 OK。

  6. 在“Envelop”架构属性中选择椭圆型按钮 [...]。在上下文菜单中,选择标记为 .NewOrderEnv 的架构,然后单击 OK。

  7. 保存管道。

这里,将希望构建和部署项目。由于正在使用基于内容的路由选择来传输消息,因此将设置一个具有接收位置的新接收端口和一个新发送端口。

设置接收位置

  1. 使用 BizTalk Explorer,创建一个新接收端口并将其命名为 SQLAdapterExplore_NewOrders。

  2. 将一个接收位置添加到该接收端口,并将其命名为 ReceiveNewOrders。

  3. 将传输类型设置为 SQL,然后单击“Address (URI)”属性中的椭圆型按钮 [...]。

  4. 属性的设置如表 1 所示:

    表 1 属性值

    属性

    值

    找到数据时轮询

    False

    轮询间隔

    5

    轮询度量单位

    分钟

    连接字符串

    将在下文解释

    文档根元素名称

    NewOrders

    文档目标命名空间

    http://SQLAdapterExplore.RetrieveNewOrders

    SQL命令

    使用与上述添加生成条目步骤 8 中相同的 SELECT 语句。

    要设置“Connection String”属性,请选择椭圆型按钮 [...]。在 Data Link Properties 对话框中,将连接信息输入到 Nothwind 数据库中。可以选择使用集成安全性或使用特定的用户名和密码。如果选择使用集成安全性,将使用适配器的主机服务帐户凭据。要确定是什么凭据,请启动 BizTalk 管理控制台。在 Root\Microsoft BizTalk Server 2004 下,扩展主机。选择 Adapter for SQL Server 所配置的运行主机(如果完整安装则使用默认值)。在右边的窗格中,右键单击该服务器并选择“Credentials”。取决于数据库的安全性,可能需要给该帐户授予特定的权利。对于 Nothwind 数据库,不应当做任何更改。

    注:Adapter for SQL Server 不支持动态端口配置。任何连接信息都必须在设计时硬编码。

    将根据“Connection String”属性中的输入值填充 URL 字段。如前面所提到的,通过在它的末尾添加文本,可以使得该值是唯一的。

  5. 将“Receive Handler”属性设置为 BizTalkServerApplication。

  6. 将“Receive Pipeline”属性设置为前面创建的 <your project>.NewOrderSplit 管道。

  7. 单击 OK 完成。

下一步是创建新的发送端口。使基于内容的路由选择正常工作的关键是,让发送端口订阅特定接收端口接收的消息。通过在发送端口中使用过滤器来做到这一点。

创建新的发送端口

  1. 使用 BizTalk Explorer 创建一个新的发送端口并将其命名为 SQLAdapterExplore_SendNewOrders。

  2. 将 Transport Type 属性设置为 File。

  3. 将 Address(URI) 属性设置为您所希望的位置。

  4. 在 Configurations 下选择 Send,并将 Pipeline 属性设置为默认的传输管道。

  5. 在 Filter & Maps 下选择 Filters。在属性下滚动直到找到 BTS.ReceivePortName 属性并选择它。

  6. 在运算符下选择 ==。

  7. 在 Value 下输入SQLAdapterExplore _NewOrders。这正是上面一节中创建的接收端口。确保输入值中没有引号。

要运行该过程,请启动发送端口并启用接收位置。由于使用了一条 SELECT 语句,该语句选择没有发货日期的订单,因此每次在轮询间隔运行 SELECT 语句时都将接收到同样的一组 XML 文件。要关闭示例,请禁用接收位置。

插入新订单

在新的销售支持系统中生成的订单必须要添加到现有的基于 SQL Server 的解决方案中。BizTalk Server 将以 XML 消息的格式定期接收新订单。每条订单消息由订单信息和行式项目信息组成。将使用编排中的一个映射来生成发送到 SQL Server 的消息,以通过一条 XML 消息更新 Nothwind 数据库的 Orders 表和 Order Details 表。

编排中的映射生成的消息将是一个 Updategram。回忆对 Updategram 的讨论,Updategram 可由多个块组成以便于事务的处理。在本例中,必须要更新 Orders 表以及相关的 Order Details 表。如果更新 Orders Details 表有问题,就不应当在 Orders 表中保留相关的记录。当添加一个生成项以创建 updategram 架构时,只支持选择一个表。为了便于使用一条消息更新多个表,架构需要一些其他步骤,如下所示:

添加生成项

  1. 右键单击项目,单击 Add£¬然后单击 Add Generated Items。

  2. 在该向导的第一步中,在 Generated Schema Files 类别下选择 Add Adapter template,然后单击 Next。

  3. 在 Select Adapter 页上选择 SQL,其他选项保留默认值,然后单击 Next。

  4. 在 Database Information 页上单击 Set 以输入连接信息。这将用来创建到数据库的连接字符串。输入有关 Link Properties 对话框的信息,然后单击 OK。当返回该向导的“Database Information”页时,单击 Next。

  5. 在 Schema Information 页上,输入适配器将用来向架构添加一些其他信息的信息,该架构表示由 SQL Server生成的表。对于目标命名空间,使用 http://SQLAdapterExplore.InsertOrderUpdategram。由于是在发送消息,因此选择 Send port 作为端口类型。Request root element name 将被设置为 InsertOrderRequest,而 Response root element name 将被设置为 InsertOrderResponse。请注意,稍后将使用这些目标命名空间和根元素名称。

  6. 单击 Next 移到下一步。

  7. 在 Statement Type 信息页上,可以选择 Updategram 或 Stored Procedure。本例中将使用 Updategram。单击 Next 继续。

  8. 对于这种特殊业务要求,将在数据库中插入新记录。在“Statement Information”页上的选择将决定适配器如何组织 Updategram 来插入、更新或删除记录。选择 Insert 作为类型,并选择 Orders Details 作为表名。在 Columns to update 部分,可以选择要更改的特定列。对于本例,由于将插入所有的列,因此全选它们。单击 Next 继续。

  9. 现在完成了添加生成项过程,单击 Finish 完成。

添加生成项过程在项目中创建了两个新的项。第一个项是多部分消息架构,它表示要在 Orders 表中插入新记录的 Updategram,以及将要返回的状态。该架构命名为 InsertOrdersService.xsd。可以选择将该架构重命名为更适合项目的名称。该架构如图 9 所示。

图 9 新架构

请注意,已经为<after> 部分添加了该字段。回忆上文对 Updategram 的讨论,即当消息只有一个<after> 块,而没有对应的 <before>块时,它就执行插入操作。还请注意,表名 Orders 作为属性(表示列)的父级。

由添加生成项向导添加的第二个项是一个新编排。同样,可能希望将该编排重命名为更适合项目的名称。并没有要求使用该编排。可以使用生成编排中的端口类型和多部分消息类型作为示例来将生成的架构添加到所选择的编排中。该过程在 BizTalk Server 2004 Help 中描述。

至此,您已经有了一个在 Order 表中插入记录的 Updategram。遗憾的是,这并不能满足业务要求。您还必须在 Order Details 表中插入记录,它必须是相同消息的一部分。为了便于实现这一点,将创建一个 Updategram 来在 Order Detail 表中插入记录,并将其添加到刚创建的 Order Updategram 中。

添加生成的项

  1. 右键单击该项目,单击 Add,然后单击 Add Generated Items。

  2. 在该向导的第一步中,在 Generated Schema Files 类别下选择 Add Adapter template,然后单击 Next。

  3. 在 Select Adapter 页上,选择 SQL,其他选项保留默认值,然后单击 Next。

  4. 在 Database Information 页上,单击 Set 以输入连接信息。这将用于创建到数据库的连接字符串。输入有关“Data Link Properties”对话框的信息,然后单击 OK。当返回向导的“Database Information”页时,单击 Next。

  5. 在 Schema Information 页上,输入适配器将用来向架构添加其他一些信息的信息,该架构表示由 SQL Server 生成的表。对于目标命名空间,使用http://SQLAdapterExplore.InsertOrderDetailUpdategram。由于正在发送消息,因此选择 Send port 作为端口类型。请求根元素名设置为 OrderDetailsInsertRequest,而 Response 根元素名将设置为 OrderDetailsInsertResponse。请注意,稍后将使用这些目标命名空间和根元素名。

  6. 单击 Next 移到下一步。

  7. 在 Statement Type 信息页上可以选择 Updategram 或 Stored Procedure。本例将使用 Updategram。单击 Next 继续。

  8. 对于这种特殊的业务要求,将在数据库中插入新记录。在 Statement Information 页上的选择将决定适配器如何组织 Updategram 来插入、更新或删除记录。选择 Insert 作为操作类型,并选择 Order Details 作为表名。在 Columns to update 部分,可以选择要更改的特定列。对于本示例,将插入所有列,因此全选它们。单击 Next 继续。

  9. 现在已完成添加生成项的过程,单击 Finish。

添加生成项过程又在项目中创建了两个新项。第一个项是多部分消息架构,它表示要在 Order Details 表中插入新记录的 Updategram,以及将要返回的状态。将该架构命名为 InsertOrderDetailsService.xsd。该架构如图 10 所示。

图 10 架构 InsertOrderDetailsService.xsd

下一步是根据刚才创建的架构将 Order Details 部分添加到在第一步创建的 Orders 架构中。BizTalk 编辑器不支持在架构之间复制和粘贴节点,因此必须在 BizTalk 编辑器外部编辑文件。可以选择 XML 编辑工具,或只是使用一个文本编辑器。如果使用文本编辑器,则采用下面的步骤。

根据架构添加 Order Details 部分

  1. 在文本编辑器中打开 InsertOrdersService.xsd 文件。

  2. 在该编辑器中打开 InsertOrderDetailsService.xsd 文件并找到下面的代码行:

    <xs:element minOccurs="0" maxOccurs="unbounded" name="_x005b_Order_x0020_Details  
    
  3. 突出显示从步骤 2 指示的行到第一个 标记的部分。复制这些突出显示的文本。

  4. 定位到 InsertOrdersService.xsd 文件中的第一个 </xs:element>标记,并将复制的文本添加到该行下面。

  5. 保存该文件。

现在该文件在 BizTalk 编辑器中如图 11 所示。

图 11 已编辑的 InsertOrdersService.xsd 文件

准备 Updategram 架构所要求的最后一步是将 Order Details 记录和 Orders 记录关联起来。Northwind 数据库中的 Orders 表有一个自动增加的 OrderID 字段,或者一个 Identity 字段。因此,当插入记录时,将自动生成 OrderID 值,将相关记录插入到 Order Details 子表中需要相同的值。使用 updg:at-identity属性, SQLXML 使您能够捕获为 Identity 字段生成的值。采用下面的步骤将该属性添加到 InsertOrdersService 架构中。

将 updg:at-identity 属性添加到 InsertOrdersService 架构中

  1. 右键单击项目,单击 Add,然后单击 Add New Item。

  2. 向项目添加一个新架构并将其命名为 UpdateGram_identity.xsd。

  3. 选定 Root 节点并删除它。

  4. 右键单击 <Schema>节点,单击 Insert Schema Node,然后单击 Child Field Attribute。将该属性命名为 returnid。将它的数据类型更改为 xs:int。

  5. 右键单击 <Schema>节点,单击 Insert Schema Node,然后单击 Child Field Attribute。将该属性命名为 at-identity。将它的数据类型更改为 xs:int。

  6. 将 Target 命名空间属性更改为 urn:schemas-microsoft-com:xml-updategram。

  7. 保存该架构。

    注:本示例没有使用 returnid 属性。如果需要可以使用该属性检索 SQL Server 自动生成的值。

下一个过程是将 UpdateGram_identity.xsd 架构导入到 InsertOrdersService.xsd 以使在以前步骤中创建的属性可用。

将 UpdateGram_identity.xsd 架构导入到 InsertOrdersService.xsd

  1. 在 BizTalk 编辑器中打开 InsertOrdersService 架构。

  2. 选定 <Schema> 节点,并定位到 Imports 属性,然后单击椭圆型按钮 [...]。

  3. 在下拉表中保留默认的 XSD 导入值并选择 Add。

  4. 扩展 Schema,选择 UpdateGram_identity 架构,然后单击 OK。

  5. 在添加到网格底部的新行中,将前缀字段中的 ns0 更改为 updg。

  6. 右键单击 Orders 节点,单击 Insert Schema Node,然后单击 Child Field Attribute。

  7. 定位新属性的 Data Type 特性,然后选择位于该列表底部的 updg:at-identity(引用)类型。

  8. 保存该架构。

Update架构现在已完成,并且构造成在 Orders 表中插入记录,检索 OrderID 列自动增加的值,并利用检索的 OrderID 列的标识值插入 Order Details 子表记录。在剩余的步骤中,将创建将 New Order 消息转换为 InsertOrdersService Updategram 的映射。然后将创建一个简单的编排来检索该消息,执行转换并将Updategram 发送到 Adaptor for SQL Server 然后到 SQL Server。

创建映射

  1. 右键单击项目,单击 Add,然后单击 Add Existing Item。

  2. 从包含的示例中找到 CustomerOrder.xsd 文件。

  3. 右键单击项目,单击 Add,然后单击 Add New Item。

  4. 单击 Map,将该名称更改为 NewOrder_To_InsertOrderUpdategram.btm,然后单击 Open。

  5. 添加 CustomerOrder 架构作为源。添加 InsertOrdersService 架构作为目的地。

  6. 连接除 OrderID、Freight 和 Unit Price 之外的所有字段。这些字段需要 Functoid。

  7. 添加一个循环 Functoid 并连接源中的 LineItem 记录和目标中的 Order Detail 记录。这将会为每个行式项目创建一个订单详细信息记录。

  8. 添加一个字符串连接 Functoid。选择 Functoid 的 Input Parameters 属性。在“Configure Functoid Inputs”窗口中,添加一个新常量并将它的值设置为 $(货币数据类型的格式必须为 $xxx.xx),然后单击 OK。

  9. 将源的 Freight 字段连接到 Functoid。将 Functoid 连接到目的地的 Freight 字段。

  10. 为 Unit Price 字段重复步骤 9。

  11. 要将 at-identity 属性与 Order Detail 记录的 OrderID 字段关联起来,请添加一个新的 String Concatenate Functoid。将 updg:at-identity 属性连接到 Functoid。将目的地 OrderID 字段的 Order Details 记录添加到 Functoid。

  12. 选择 Functoid 的 Input Parameters 属性。在 Configure Functoid Inputs 窗口中,添加一个新常量,并将其值设置为 1。该值是多少不重要,因为它将由插入的 Orders 记录的标识值代替。

  13. 保存该映射。

该映射如图 12 所示。

图 12 转换映射

创建编排

添加第一个生成项的结果是创建了一个默认的编排。这个默认的编排已经有一个多部分消息类型,它表示 InsertOrdersService 架构。由于已经对该架构做了全面更改,因此只使用编排。执行以下步骤可以完成这个编排。

完成该编排

  1. 创建一条新消息并将其命名为 InsertOrder。将 Message Type 属性设置为下拉列表中的 InsertOrderRequest。这就是 Updategram。

  2. 创建另一条新消息并将其命名为 NewOrder。将 Message Type 属性设置为下拉列表中的 CustomerOrder。这就是从示例文件中添加的架构。

  3. 添加一个 Receive 形状。将其名称设置为 ReceiverOrder。将 Message 属性设置为 NewOrder,并将 Activate 属性设置为 True。

  4. 在 Receive 形状下面添加新的 Transform 形状。将 Message Construct 形状的名称设置为 ConstructUpdategram。在 Message Constructed 属性中,选择 InsertOrder。

  5. 将转换形状的名称设置为 NewOrderToUpdategram。

  6. 选择 Map Name 属性中的椭圆型按钮 [...]。在弹出窗口中,单击 Existing Map,然后从下拉列表中选择 NewOrder_To_InsertUpdateGram。将映射的Source 设置为 NewOrder,将 Destination 设置为 InsertOrder,然后单击 OK。

  7. 在 Construct Message 形状下面添加 Send 形状。将 Name 设置为 SendInsert。将 Message 属性设置为 InsertOrder。

  8. 向编排添加一个新的端口。将名称更改为 ReceiveOrderPort。这是一个单向接收端口。稍后指定绑定。

  9. 向编排添加一个新的端口。将名称更改为 SendOrderPort。这是一个单向发送端口。稍后指定绑定。

  10. 保存编排。

配置端口

最后一步是在 BizTalk Explorer 中创建端口,这样可以部署该项目。

创建端口

  1. 创建一个新的接收端口并更名为 NewOrderReceive。

  2. 创建一个新的接收位置并更名为 NewOrder。将 Transport Type 属性设置为 File,然后选择一个目录。将 receive 管道设置为默认的 XMLReceive 管道。

  3. 创建一个新的发送端口并更名为 SendOrderUpdategram。

  4. 将 Transport Type 设置为 SQL。选择 Address (URI) 属性中的椭圆型按钮 [...]。在 Transport Properties 窗口中,将连接字符串设置为 Northwind database。将 Document Target Namespace 属性设置为 http://SQLAdapterExplore.IssueSelect 以与创建的 Updategram 架构的命名空间相匹配。

  5. 将 Response 根元素名称设置为 InsertOrderResponse 以与 Updategram 架构的响应部分的节点相匹配。单击 OK 继续。

  6. 将发送管道设置为默认的 XMLTransmit 管道。单击 OK 继续。

  7. 这里希望构建和部署项目。将该编排绑定到刚创建的端口上。要运行编排,请将示例中的 CustomerOrder_input.xml 文件复制到接收位置。要查看结果,请检查 Northwind 数据库中的 Order 表和 Order Details 表。

返回页首

小结

至此,您已经很好地了解了 Adaptor for SQL Server 的功能以及如何为项目实现这种适配器的基础。切记,本文档包含的示例旨在演示使用这种适配器的常见情况,而不只是这种适配器的用法。

posted on 2008-08-19 11:20  strgvi  阅读(352)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3