使用 BizTalk Server 在 SQL Server 上运行复合操作

SQL 适配器使适配器客户端能够在 SQL Server 数据库上执行复合操作。 复合操作可以包括:

  • 插入、更新和删除操作。 组合操作不支持选择操作。

  • 作为操作执行的存储过程。

    单一复合操作可以按任意顺序包含任意数量的此类操作。 例如,可以有两个插入操作,接着是一个删除操作,最后是执行一个存储过程。 此外,还可以对不同的数据库表或视图执行不同的操作。 有关适配器如何支持复合作的详细信息,请参阅 使用 SQL 适配器在 SQL Server 中运行复合作。 有关复合作的 SOAP 消息结构的信息,请参阅 复合作的消息架构

注释

如果对包含用户定义类型列的表进行操作,请确保在开始开发应用程序之前,参考 使用 SQL 适配器在具有 User-Defined 类型的表和视图上操作

如何在 SQL Server 上执行复合操作

使用 SQL 适配器通过 BizTalk Server 在 SQL Server 上执行操作涉及到 使用 SQL 适配器开发 BizTalk 应用程序的构建基块中描述的过程任务。 若要对 SQL Server 数据库执行复合操作,这些操作包括:

  1. 创建 BizTalk 项目,并为您希望调用的所有操作生成架构。

  2. 手动创建一个架构文件,其中包含对上一步中生成的所有架构的引用。

  3. 在 BizTalk 项目中创建消息,以便从 SQL Server 数据库发送和接收消息。 这些消息必须符合在上一步中创建的请求和响应架构。

  4. 创建一个编排,以在 SQL Server 数据库上调用组合操作。

  5. 生成和部署 BizTalk 项目。

  6. 通过创建物理发送和接收端口来配置 BizTalk 应用程序。

  7. 启动 BizTalk 应用程序。

    本主题提供有关如何执行这些任务的说明。

基于本主题的示例

BizTalk 适配器包提供了一个名为“CompositeOperations”的示例,针对本主题。 有关详细信息,请参阅 SQL 适配器的示例

生成架构

在本主题中,为了演示如何执行复合操作,将按指定顺序完成以下任务:

  • 将记录插入 EMPLOYEE 表中。

  • 通过调用GET_LAST_EMP_DATA存储过程检索上次插入记录的所有列。

  • 从 EMPLOYEE 表中删除记录。

    运行示例提供的脚本以创建 EMPLOYEE 表。 有关示例的详细信息,请参阅 架构示例

    必须创建 BizTalk 项目,并使用“使用适配器服务插件”生成这些操作的架构。 有关如何生成架构的详细信息,请参阅 使用 SQL 适配器在 Visual Studio 中检索 SQL Server 操作的元数据

创建复合架构定义

现在必须创建一个引用为单个操作创建的模式的复合模式。 执行以下步骤来创建复合架构定义。

添加复合架构定义

  1. 将架构文件添加到 BizTalk 项目。 右键单击项目名称,指向 “添加”,然后单击“ 新建项”。 在“ 添加新项 ”对话框中的“ 类别 ”框中,单击“ 架构文件”。 在 “模板 ”框中,单击“ 架构”。 指定架构文件的名称,然后单击“ 确定”。

    对于此示例,请将架构文件名指定为 CompositeSchema.xsd.

  2. 为您希望执行的不同操作添加生成的架构引用。 在此示例中,针对操作生成的不同架构包括:

    • TableOperation.dbo.Employee.xsd,用于插入和删除操作。

    • Procedure.dbo.xsd,用于GET_LAST_EMP_DATA存储过程。

      添加引用:

    1. 右键单击 CompositeSchema.xsd 中的根 <架构> 节点,然后单击“ 属性”。

    2. “属性”框中,针对 Imports 属性单击省略号按钮(...)。

      导入架构定义

    3. 在“ 导入” 对话框中,从 “导入新架构” 列表中选择 “XSD 导入”,然后单击“ 添加”。

    4. BizTalk 类型选取器 对话框中,展开 BizTalk 项目名称节点,展开 “架构”,然后选择要导入的架构。 对于此示例,请选择 <BizTalk_project_name>.TableOperation_dbo_Employee。 单击 “确定”

      重复此步骤以导入<BizTalk_project_name>和<Procedure_dbo>。

    5. 在“ 导入 ”对话框中,单击“ 确定”。

  3. 将两个子节点添加到根架构节点。 一个子节点对应于执行复合操作的请求方案。 另一个子节点对应于响应架构。 与请求架构对应的节点可以具有任何名称。 与响应架构相对应的节点必须被命名为<request_schema_node>响应。 对于此示例,我们将请求架构节点称为 请求。 因此,响应架构节点称为 RequestResponse

    注释

    默认情况下, 节点也会添加到新的架构文件中。 可以将 节点重命名为 “请求”。 若要重命名节点,请右键单击节点名称,然后单击“ 重命名”。

    <架构>节点下添加节点时,

    1. 右键单击 <架构> 节点,指向 “插入架构节点”,然后单击“ 子记录”。

    2. 将新节点重命名为 RequestResponse

  4. 请求节点下添加与作为复合操作一部分执行的每个操作的请求架构对应的子节点。 对于此示例,必须添加对应于以下内容的子节点:

    • 在 EMPLOYEE 表上插入和删除操作。

    • GET_LAST_EMP_DATA存储过程。

    重要

    必须按照与要执行操作相同的顺序添加节点。 例如,如果要插入记录,然后执行存储过程,然后删除记录,必须先添加插入作的节点,然后添加存储过程的节点,最后是删除作的节点。

    将子节点添加到 请求 节点:

    1. 右键单击 “请求 ”节点,指向 “插入架构节点”,然后单击“ 子记录”。

      58992131-13a6-45c3-9513-5c0995091fae为架构 插入子节点

    2. 将记录重命名为符合您作为复合操作一部分执行的操作的请求模式。 例如,将节点重命名为“Insert”。

    3. Insert 节点映射到 EMPLOYEE 表上执行 Insert 操作的请求架构。 为此,请右键单击 “插入 ”节点,然后单击“ 属性”。 在“属性”框中,从“数据结构类型”列表中选择“插入”(引用)。

      将子节点映射到请求架构

    4. 重复这些步骤,为GET_LAST_EMP_DATA存储过程以及Delete操作的请求架构添加节点。 指定节点名称,并将其映射到下表中所述的相应架构。

      节点名称 映射到架构
      获取最新员工数据 GET_LAST_EMP_DATA(参考信息)
      删除 删除(参考)
  5. RequestResponse 节点下添加子节点,这些子节点对应于作为复合操作的一部分执行的每个操作的响应架构。 对于此示例,必须添加对应于以下内容的子节点:

    • 在 EMPLOYEE 表上插入和删除操作。

    • GET_LAST_EMP_DATA存储过程。

    重要

    必须按照 请求节点下 子节点的顺序添加子节点。

    将子节点添加到 RequestResponse 节点:

    1. 右键单击 RequestResponse 节点,指向 “插入架构节点”,然后单击“ 子记录”。

    2. 将记录重命名以对应您作为复合操作的一部分执行的操作的响应架构。 例如,将节点重命名为“InsertResponse”。

    3. InsertResponse 节点映射到 EMPLOYEE 表的 Insert 操作的响应架构。 为此,请右键单击 InsertResponse 节点,然后单击“ 属性”。 在“属性”框中,从“数据结构类型”列表中,选择“InsertResponse”(引用)。

    4. 重复这些步骤,为GET_LAST_EMP_DATA存储过程和删除操作的响应架构添加节点。 指定节点名称,并将其映射到下表中所述的相应架构。

      节点名称 映射到架构
      GET_LAST_EMP_DATAResponse GET_LAST_EMP_DATAResponse(参考)
      删除响应 DeleteResponse (参考)
  6. 保存 CompositeSchema.xsd 文件。

定义消息和消息类型

在上一步中创建的复合架构描述了业务流程中消息所需的“类型”。 消息通常是变量,类型由相应的架构定义。 现在必须为编排创建消息,并将其链接到在上一步中创建的架构。

  1. 将一项编排添加到 BizTalk 项目中。 在解决方案资源管理器中,右键单击 BizTalk 项目名称,指向 “添加”,然后单击“ 新建项”。 键入 BizTalk 业务流程的名称,然后单击“ 添加”。

  2. 打开 BizTalk 项目的“业务流程视图”窗口(如果尚未打开)。 为此,请单击“ 视图”,指向 “其他窗口”,然后单击“ 业务流程视图”。

  3. 在业务流程视图中,右键单击 “消息”,然后单击“ 新建消息”。

  4. 右键单击新创建的消息,然后选择“ 属性窗口”。

  5. Message_1“属性”窗格中,执行以下作:

    用这个 要执行的操作
    标识符 类型 Request
    消息类型 在下拉列表中,展开 “架构”,然后选择 CompositeOp.CompositeSchema.Request,其中 CompositeOp 是 BizTalk 项目的名称。 CompositeSchema 是您为复合操作手动创建的模式。
  6. 重复步骤 2 以创建新消息。 在新消息的 “属性 ”窗格中,执行以下作:

    用这个 要执行的操作
    标识符 类型 Response
    消息类型 在下拉列表中,展开 架构,然后选择 CompositeOp.CompositeSchema.RequestResponse

设置业务流程

为了使用 BizTalk Server 在 SQL Server 上执行组合操作,您必须创建一个 BizTalk 业务流程。 在此业务流程中,会在定义的接收位置投递请求消息。 请求消息必须符合之前创建的复合架构。 SQL 适配器使用此消息并将其传递到 SQL Server。 SQL Server 的响应将保存到另一个位置。 必须包含“发送和接收”形状,才能将消息分别发送到 SQL Server 和接收响应。 执行复合操作的基本编排如下:

编排以执行组合操作

添加消息形状

请确保为每个邮件形状指定以下属性。 “形状”列中列出的名称是消息形状的名称,如上述编排中所显示。

形状 形状类型 性能
接收消息 接收 - 将 名称 设置为 ReceiveMessage
- 将 “激活 ”设置为 True
发送消息 发送 - 将 名称 设置为 SendMessage
接收响应 接收 - 将 名称 设置为 ReceiveResponse
- 将 “激活 ”设置为 False
SendResponse 发送 - 将 名称 设置为 SendResponse

添加端口

请确保为每个逻辑端口指定以下属性。 端口列中列出的名称是在编排中显示的端口的名称。

港口 性能
MessageIn - 将 标识符 设置为 MessageIn
- 将 类型 设置为 MessageInType
- 将 通信模式 设置为 单向
- 将通信方向设置为接收
LOBPort - 将 标识符 设置为 LOBPort
- 将 类型 设置为 LOBPortType
- 将 通信模式 设置为 请求-响应
- 将 通信方向 设置为 发送接收
ResponseOut - 将 标识符 设置为 ResponseOut
- 将 类型 设置为 ResponseOutType
- 将 通信模式 设置为 单向
- 将通信方向设置为发送

指定动作形状的消息,并将其连接到端口

下表列出了为操作形状指定消息及将消息链接到端口时需要设置的属性及其值。 Shape 列中列出的名称是前文提到的业务编排中显示的消息形状的名称。

形状 性能
接收消息 - 将 消息 设置为 请求
- 将操作设置为MessageIn.CompositeOp.Request
发送消息 - 将 消息 设置为 请求
- 将 操作 设置为 LOBPort.CompositeOp.Request
接收响应 - 将 消息 设置为 响应
- 将 操作 设置为 LOBPort.CompositeOp.Response
SendResponse - 将 消息 设置为 响应
- 将 操作 设置为 ResponseOut.CompositeOp.Request

指定这些属性后,消息形状符和端口被连接,您的编排已完成。

现在必须生成 BizTalk 解决方案并将其部署到 BizTalk Server。 有关详细信息,请参阅 生成和运行业务流程

配置 BizTalk 应用程序

部署 BizTalk 项目后,前面创建的业务流程将列在 BizTalk Server 管理控制台中的“业务流程”窗格下。 必须使用 BizTalk Server 管理控制台来配置应用程序。 有关演练,请参阅 演练:部署基本 BizTalk 应用程序

配置应用程序涉及:

  • 为应用程序选择主机。

  • 将业务流程中创建的端口映射到 BizTalk Server 管理控制台中的物理端口。 对于此编排,必须:

    • 请在硬盘上指定一个位置及其对应的文件端口,以便放置请求消息。 BizTalk 业务流程将使用请求消息并将其发送到 SQL Server 数据库。

    • 定义硬盘上的位置和相应的文件端口,BizTalk 业务流程将删除包含来自 SQL Server 数据库的响应的响应消息。

    • 定义物理 WCF-Custom 或 WCF-SQL 发送端口以将消息发送到 SQL Server 数据库。 由于作为复合操作一部分的操作在单个事务中执行,因此请确保 UseAmbientTransaction 绑定属性设置为 True

      还必须在发送端口中指定操作。 复合操作的动作是“CompositeOperation”。 有关如何创建端口的信息,请参阅 手动配置到 SQL 适配器的物理端口绑定。 有关如何为端口指定操作的详细信息,请参阅 为 SQL 适配器配置 SOAP 操作

      注释

      使用“消耗适配器服务”BizTalk 项目外接程序生成架构时,还会创建一个绑定文件,其中包含有关这些端口及其对应操作信息。 可以从 BizTalk Server 管理控制台导入此绑定文件,以创建发送端口(用于出站呼叫)或接收端口(对于入站呼叫)。 有关详细信息,请参阅 使用端口绑定文件配置物理端口绑定以使用 SQL 适配器。 如果导入此绑定文件,则 WCF-Custom 或 WCF-SQL 发送端口的操作将被设置为涉及在生成架构时于“使用适配器服务外接程序”中选择的所有操作的动态操作。 对于复合操作,必须将动态操作替换为“CompositeOperation”。

启动应用程序

必须启动 BizTalk 应用程序才能对 SQL Server 数据库执行复合操作。 有关启动 BizTalk 应用程序的说明,请参阅 如何启动业务流程

在此阶段,请确保:

  • 用于接收业务流程请求消息的 FILE 接收端口正在运行。

  • 用于从业务流程接收响应消息的 FILE 发送端口正在运行。

  • WCF-Custom 或 WCF-SQL 发送端口用于将消息发送到 SQL Server 数据库,并且当前正在运行。

  • 正在运行该操作的 BizTalk 业务流程。

执行操作

运行应用程序后,必须将请求消息投递到 FILE 接收位置。 请求消息的架构必须符合之前您创建的复合操作的架构。 例如,在 EMPLOYEE 表中插入记录的请求消息、调用GET_LAST_EMP_DATA存储过程,并从 EMPLOYEE 表中删除记录为:

<Request xmlns="http://CompositeTest.CompositeSchema">  
  <Insert xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
    <Rows>  
      <Employee xmlns="http://schemas.microsoft.com/Sql/2008/05/Types/Tables/dbo">  
        <Name>John</Name>  
        <Designation>Manager</Designation>  
        <Salary>100000</Salary>  
      </Employee>  
    </Rows>  
  </Insert>  
  <GET_LAST_EMP_DATA xmlns="http://schemas.microsoft.com/Sql/2008/05/Procedures/dbo" />  
  <Delete xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
    <Rows>  
      <Employee xmlns="http://schemas.microsoft.com/Sql/2008/05/Types/Tables/dbo">  
        <Name>John</Name>  
      </Employee>  
    </Rows>  
  </Delete>  
</Request>  

有关使用 SQL 适配器对 SQL Server 数据库执行复合操作的请求消息架构的详细信息,请参阅 复合操作的消息架构

协调流程使用消息并将其发送到 SQL Server 数据库。 SQL Server 数据库的响应保存在编排过程中定义的其他 FILE 位置。 例如,来自 SQL Server 数据库的上述请求消息的响应为:

<?xml version="1.0" encoding="utf-8" ?>   
<RequestResponse xmlns="http://CompositeTest.CompositeSchema">  
  <InsertResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
    <InsertResult>  
      <long xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">10080</long>   
    </InsertResult>  
  </InsertResponse>  
  <GET_LAST_EMP_DATAResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/Procedures/dbo">  
    <GET_LAST_EMP_DATAResult>  
      <DataSet xmlns="http://schemas.datacontract.org/2004/07/System.Data">  
        <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
          <xs:element msdata:IsDataSet="true" name="NewDataSet">  
            <xs:complexType>  
              <xs:sequence>  
                <xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable">  
                  <xs:complexType>  
                    <xs:sequence>  
                      <xs:element minOccurs="0" name="Employee_ID" type="xs:int" />   
                      <xs:element minOccurs="0" name="Name" type="xs:string" />   
                      <xs:element minOccurs="0" name="DOJ" type="xs:dateTime" />   
                      <xs:element minOccurs="0" name="Designation" type="xs:string" />   
                      <xs:element minOccurs="0" name="Job_Description" type="xs:string" />   
                      <xs:element minOccurs="0" name="Photo" type="xs:base64Binary" />   
                      <xs:element minOccurs="0" name="Rating" type="xs:string" />   
                      <xs:element minOccurs="0" name="Salary" type="xs:decimal" />   
                      <xs:element minOccurs="0" name="Last_Modified" type="xs:base64Binary" />   
                    </xs:sequence>  
                  </xs:complexType>  
                </xs:element>  
              </xs:sequence>  
            </xs:complexType>  
          </xs:element>  
        </xs:schema>  
        <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">  
          <NewDataSet xmlns="">  
            <NewTable>  
              <Employee_ID>10080</Employee_ID>   
              <Name>John</Name>   
              <Designation>Manager</Designation>   
              <Salary>100000.00</Salary>   
              <Last_Modified>AAAAAAAAF40=</Last_Modified>   
            </NewTable>  
          </NewDataSet>  
        </diffgr:diffgram>  
      </DataSet>  
    </GET_LAST_EMP_DATAResult>  
    <ReturnValue>0</ReturnValue>   
  </GET_LAST_EMP_DATAResponse>  
  <DeleteResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
    <DeleteResult>1</DeleteResult>   
  </DeleteResponse>  
</RequestResponse>  

上述响应包含多个结果集,这些结果集对应于作为复合操作的一部分执行的不同操作。 例如,元素 InsertResult 包含 10080,它是新添加记录的唯一标识符。

最佳做法

部署并配置 BizTalk 项目后,可以将配置设置导出到名为绑定文件的 XML 文件。 生成绑定文件后,可以从文件导入配置设置,以便无需为同一业务流程创建发送端口和接收端口等项。 有关绑定文件的详细信息,请参阅 重复使用适配器绑定

另请参阅

使用 SQL 适配器开发 BizTalk 应用程序