CData 高级配置
Version 24.2.9039
Version 24.2.9039
CData 高级配置
CData 端口的 高级设置 选项卡允许配置端口的高级属性及其数据处理方法。以下部分详细介绍了以下功能和配置:
高级选项卡上的许多其他设置都是从正在使用的数据源动态加载的,因此本文档中未介绍它们。 高级选项卡 中描述了非特定于数据源的设置。
提示:可以突出显示应用程序中的任何字段以显示工具提示,其中包含有关该字段功能的更多信息。
XML 模型
CData 端口将知行之桥中的 CData 表建模为 XML。建模遵循以下结构:
- 父元素标识要插入的表。
- 每个子元素对应目标表中的一列。
这在 XML 元素和 CData 值之间建立了连接,这允许端口从传入的 XML 文档中读取值并在 INSERT 或 UPDATE 查询中使用它们。
单击配置面板上方的 </> 代码 可以查看表的 XML 模型。以下 XML 是名为 Account 的表的简化示例模型:
<Items>
<Account action="upsert">
<Id key="true" />
<account_c />
<AccountNumber />
<AccountSource />
</Account>
</Items>
在上面的例子中,Id、account_c、AccountNumber和AccountSource是Account表的列。当端口处理与此结构匹配的 XML 文件时,它会自动将来自该 XML 的值插入到 Account 表中。当端口查询 Account 表时,它会输出与此结构匹配的 XML。
批处理输入
CData 端口支持批处理以提高插入大量数据时的性能。批处理通过 高级设置 部分下标记为 事务大小 和 批处理大小 的两个字段进行配置。当这些字段设置为正整数时,端口在单个操作(批处理)中插入 [批处理大小] 记录,并在单个连接(事务)中插入 [事务大小] 记录。
XML 输入文件可以包含比单个事务大小更多的记录,在这种情况下,端口将在多个事务中插入数据
如果在批量插入过程中发生错误,端口将回滚事务并缓存失败事务中第一条记录的索引。重试输入文件时,只有缓存索引之后的记录才会插入到CData中。
批量输出
当查询输出时,端口可以配置为支持将记录一起批量输出到单个文档中。 最大记录数 设置可用于控制单个消息中应包含多少条记录,批处理大小 设置可用于指示单个批处理组中应包含多少个批处理消息。
子表
CData 端口支持使用单个操作更新和选择多个表。创建具有多个表的表模型时,这些表之间应该有外键关系,表示一个表是另一个表的子表。
要与子表交互,首先创建一个以父表为目标的模型。然后使用 +添加 按钮从配置面板中添加子表。从表列表中选择子表,设计器将自动填充表的层次结构,然后选择应包含在模型中的子表的列。
子表 XML
插入父表和子表时,输入映射 XML 结构将是多层的。以下 XML 是通过外键关联的两个表的示例输入映射:
<Account action="upsert">
<Id key="true" />
<account_c />
<AccountNumber />
<AccountSource />
<AccountPartner>
<Id key="true" />
<AccountFromId ref="@Id" />
<IsPrimary />
<OpportunityId />
<Role />
</AccountPartner>
</Account>
在上面的例子中,Account 是父表,AccountPartner 是子表。当 CData 端口处理匹配此结构的输入 XML 文件时,它会更新 Account 和 AccountPartner 表并确保链接两条记录的键相同。
REF
子表中的某些列标有蓝色 REF 标记。此标记表示这些列对应于父表中的主键。在对父表进行插入之后,在对子表进行插入之前,端口会在父表中查询它刚刚插入的记录的主键。然后,端口在插入子表时使用此值。
当父表的主键由 CData 生成时,这很有用。在这种情况下,此列不会作为输入 XML 传入,因此端口在将记录插入到父表中之前不知道该列的值。.
在 XML 模型中,ref 属性表示可以稍后引用列,或者应该从映射中的另一列读取列的值。为了引用由 CData 生成的列的值,列元素应包含一个 ref 属性,该属性设置为保留值 LAST_INSERT_ID
:
<Item action="upsert">
<Id key="true" upsert="id" ref="@@LAST_INSERT_ID" />
这表明 id 值将在插入后检索,并且可以在以后引用(通常在子表中)。要稍后引用此值,请将 ref 元素设置为相关列的名称:
<id key="true" ref="@id" />
在上面的例子中,id_是父表中主键的名称,也是子表中某列的名称。 ref 语法指示端口在插入后从父表中检索 _id,然后将检索到的值用作子表中的 id 列。
从子表中查找
通常,当从父表和子表中选择时,如果外键与父表中的主键匹配,则应仅从子表中提取记录。
例如,假设一个 Select 从父表 PurchaseOrders 和子表 PurchaseOrderLineItems 中提取采购订单数据。从 PurchaseOrders 拉取的每条记录(订单)还应拉取与该订单关联的行项目。这两个表通过共享列关联,例如 PONumber 列是 PurchaseOrders 表的主键和 PurchaseOrdersLineItems 表中的外键。如果订单项的 PONumber 与从父表中提取的订单的 PONumber 匹配,则应仅从子表中提取订单项记录。
要在知行之桥中建立这种关系,请向 Select 添加一个新过滤器并按如下方式配置它:
- 在第一个(左侧)下拉列表中,选择作为父表外键的子表列。在上面的示例中,这将是 PurchaseOrderLineItems 表的 PONumber 列。
- 在中间(运算符)下拉列表中,选择 equal
- 在最后一个(右侧)输入框中,首先使用右侧的下拉箭头选择 REF。之后,输入框应该有$前缀,表示正在引用父表
- 使用最后一个(右侧)下拉列表选择应与子表的外键匹配的父表列。在上面的示例中,这将是 PurchaseOrders 表的 PONumber 列。
只处理新的或更改的记录
可以将选择操作配置为仅检索最近更新或添加的记录。端口可以使用两种方法来检测哪些记录是新的或被修改的。
- 第一种方法需要一个 DateTime 列来表示记录的最后修改时间
- 第二种方法需要一个列来显式存储一个值,该值表示是否应该处理记录。
这两个选项均在配置面板底部的 高级 设置中的 设置 选项卡上设置。要进一步细化您的要求,请参阅 高级 选项卡的 高级设置 部分中的三个附加 流程更改… 设置。
使用最后修改的列
在配置面板底部找到 高级设置 设置。如果检测到 DateTime 列,则选项显示为 使用列处理新的记录或已更改的记录。将此设置为表示记录的上次修改时间的相应 DateTime 列。
使用自定义列
可以配置选择操作来更新从 CData 表中成功拉取记录的列。这可以与过滤规则结合使用,该规则会仅选择列的值指示尚未拉取(或应再次拉取)的记录。
要在处理后启用列更新,请在映射编辑器底部找到 高级设置 设置。启用在成功处理行时使用值更新列,然后指定应该更新哪一列以及应该在该列中设置的值。
例如,输出映射可能配置为在提取记录后将 Processed 列更新为 1。然后,可以应用 Filter 规则,将记录限制为 Processed 不等于 1 的记录。
在此示例中,当端口处理查询模板时,它会根据模板创建一个 SELECT 语句。该模板将执行“SELECT Id、AccountId、Amount FROM INVOICE”,根据模板为结果集中的每条记录创建一个 XML 文件,并将这些文件放置在此端口的输出文件夹中。
预处理和后处理查询
你可以配置 CData 端口以在执行其配置的操作之前和之后执行其他查询。 可以通过手动修改端口生成的查询代码来配置这些附加查询。 以下部分概述了此过程。
在 UPSERT 映射
在 UPSERT 映射,在所有记录被 UPSERT 插入表之前或之后,可以自动发生的查询。
如要配置此功能,首先点击在 Upsert 配置 上的 </> Code。
打开的文本编辑器允许编辑数据表映射的高级功能。文本可能如下所示:
<Items>
<Names table="`dbo`.`Names`" action="upsert">
<ID key="true" />
<Name />
…
</Names>
</Items>
如要在任何数据插入表之前触发请求,定义一个节点有如下属性:
- requireInput 设置为 false。这是让端口不再要求必须有输入与其对应。
- insertQuery 这包含了 UPSERT 请求之前要执行的语句。
- table(可选)- 设置为要使用额外查询定位的表的名称。(在下面的示例中,表名称是 updateTable。)如果在映射的根级别发出查询(即,作为 <Items> 元素的子元素),此属性不是必需的。 如果将查询作为另一个表的子项发出,设置表属性可确保查询与该表的列区分开来。
根据你的需要,将这个元素放在前面或者后面即可。
在下面的例子中,<runFirst> 会在运行任何 UPSERT 之前运行 EXEC [dbo.FlushTemp]:
<Items>
<runFirst table="updateTable" insertQuery="EXEC [dbo].[FlushTemp]" requireInput="false" />
<Names table="`dbo`.`Names`" action="upsert">
<ID key="true" />
<Name />
…
</Names>
</Items>
在下面例子中,<runLast> 会在运行所有 UPSERT 之后运行 EXEC [dbo.FlushTemp]:
<Items>
<Names table="`dbo`.`Names`" action="upsert">
<ID key="true" />
<Name />
…
</Names>
<runLast table="updateTable" insertQuery="EXEC [dbo].[CommitTemp]" requireInput="false" />
</Items>
例子中的元素名称(runFirst 和 runLast)都是占位符,你可以随意自选。
注意:在 UPSERT 映射中的预处理和后处理查询不接受任何输入文件中的值,并且他们也不会有输出。
在 SELECT 映射中
在 SELECT 映射,在所有记录被 SELECT 插入表之前或之后,可以自动发生的查询。如要配置此功能,首先点击在 Select 配置 上的 </> Code。
打开的文本编辑器允许编辑数据表映射的高级功能。如要在任何数据插入表之前触发请求,定义一个节点有如下属性:
- requireInput 设置为 false。这是让端口不再要求必须有输入与其对应。
- selectQuery 这包含了 SELECT 请求之前要执行的语句。
- table(可选)- 设置为要使用额外查询定位的表的名称。 (在下面的示例中,表名称是 selectTable。)如果在映射的根级别发出查询(即,作为 <Items> 元素的子元素), 此属性不是必需的。 如果将查询作为另一个表的子项发出,设置表属性可确保查询与该表的列区分开来。
根据你的需要,将这个元素放在前面或者后面即可。
在下面的例子中,<runFirst> 会在运行任何 SELECT 之前运行 EXEC [dbo].[prepTable]:
<Items>
<runFirst table="selectTable" selectQuery="EXEC [dbo].[prepTable]" outputResult="false" />
<Names table="`dbo`.`Names`" action="select">
<ID key="true" />
<Name />
…
</Names>
</Items>
在下面例子中,<runLast> 会在运行所有 SELECT 之后运行 EXEC [dbo].[cleanTable]:
<Items>
<Names table="`dbo`.`Names`" action="select">
<ID key="true" />
<Name />
…
</Names>
<runLast table="selectTable" selectQuery="EXEC [dbo].[cleanTable]" outputResult="false" />
</Items>
例子中的元素名称(runFirst 和 runLast)都是占位符,你可以随意自选。
注意: SELECT 映射中的预处理和后处理查询不接受查询中未硬编码的输入元素。