RDBMSResolver 组件创建可发送到外部数据源(如 ASP/JSP 页、servlet 等)的 XML 数据包。该 XML 数据包可以轻松地转换为可用于更新任何标准 SQL 关系数据库的 SQL 语句
注意:可以使用 RDBMSResolver 组件将数据更新发送到可解析 XML 并依据数据库生成 SQL 语句的任何外部数据源(例如,ASP 页、Java servlet 或 ColdFusion 组件)。
RDBMSResolver 组件仅在 Flash Player 7 中起作用。
RDBMSResolver 组件具有以下参数:
tableName 放在 XML 中的表名,代表应更新的 DB 表。此表名应该与为应更新的任何字段的任何 fieldInfo
项目(或者它们应为空)输入的值相同。
updateMode 此参数具有多个值,这些值确定在生成 XML 更新数据包时标识关键字段的方式,如下所示:
umUsingAll
:此设置使用 FxDataset 内所有字段的旧值来标识要更新的记录。这是进行更新最安全的方法,因为它使您可以保证另一用户在您检索记录之后未对其进行修改。然而,此方法较消耗时间,并会生成较大的更新数据包。 umUsingModified
:此设置使用 FxDataset 内已修改的所有字段的旧值来标识要更新的记录。此方法使您可以保证在您检索记录之后另一用户未修改记录中的相同字段。 umUsingKey
:这是此参数的默认值:此设置使用 FxDataset 内关键字段的旧值。它包含一个当今大多数数据库系统使用的开放式并发模型。此方法保证您修改的记录与从数据库中检索出的记录是同一条。您所做的更改将覆盖任何其他用户对相同数据进行的更改。 nullValue 放在字段的值中用于指示空值的值。可以自定义此参数,以防与空字符串 (""
) 或另一个有效值混淆。
fieldInfo 如果数据源是数据库表,则它应具有一个或多个唯一标识表中的记录的关键字段。另外,可能还会有一些已计算或从另一个表连接的字段。必须对这些字段加以标识,以便可以在 XML 更新数据包内设置关键字段,并将不应更新的字段排除在 XML 更新数据包之外。
为了实现该目的,RDBMSResolver 组件提供了 fieldInfo
参数。此参数允许您定义无限多个需要特殊处理的字段。每个 fieldInfo
项目包含三个属性:
fieldName
:字段的名称。此参数应映射到数据集中的字段。ownerName
(可选):此参数用于标识组件 TableName
参数中定义的相同表未“包含”的字段。如果使用与 TableName 参数相同的值填充此参数或将其留空,则字段将以正常方式包含在 XML 更新数据包中。如果填充的内容不同,则此字段将被排除在更新数据包之外。isKey
:布尔值,对于将更新的表的所有关键字段均应设置为 true
。
以下示例标识客户表中的关键字段。 客户表中有一个唯一的关键字段,“id
”,因此您应该创建一个带有下列值的 fieldInfo 条目:
fieldName = "id",ownerName = 将此值留空,isKey = "true"
进一步举例说明,假设通过查询中的连接添加了字段 "custType"
,并且不希望在更新中包含该字段。可以创建具有以下值的字段项目:
fieldName = "custType",ownerName = "joinedField",isKey = "false"
一旦定义了字段项目,RDBMSResolver 组件即可使用它们自动生成要发送到外部数据源的 XML 更新数据包。
注意:FieldInfo
参数使用 Flash 中称为“集合编辑器”的功能。选择 FieldInfo
参数时,“集合编辑器”对话框即会打开。可以从此处添加新的 FieldInfo
项目,并集中设置它们的 fieldName
、ownerName
和 isKey
属性。
RDBMSResolver 组件的典型工作流程如下所示。
注意:Web 服务必须返回要绑定到数据集的记录数组。
注意:在调用 DataSet 组件的 applyUpdates
方法时,更新指令将从 DataSet 组件发送到 RDBMSResolver 组件。
注意:除了这些步骤之外,您还可以创建绑定以应用通过 RDBMSResolver 组件从服务器重新发送到 DataSet 组件的结果数据包。
有关详细信息,请参阅RDBMSResolver 组件。
XML 更新数据包包含三种不同类型的节点:delete
、insert
和 update
。其中每个节点代表对数据库表中的行的一种更改。每个节点都包含查找要更新的记录以及描述所做的修改(如果有)的字段节点。
从解析程序组件发送的更新采用 XML 更新数据包的形式,该数据包是通过连接器组件发送到外部数据源的。下面是 RDBMSResolver 组件的一个 XML 更新数据包示例(通过将 updateMode
参数设置为 umUsingKey
生成):
<update_packet tableName="customers" nullValue="{_NULL_}" transID="46386292065:Wed Jun 25 15:52:34 GMT-0700 2003"> <delete id="11295627477"> <field name="id" type="numeric" oldValue="10" key="true"/> </delete> <insert id="12345678901"> <field name="id" type="numeric" newValue="20" key="true"/> <field name="firstName" type="string" newValue="Davey" key="false"/> <field name="lastName" type="string" newValue="Jones" key="false"/> </insert> <update id="98765432101"> <field name="id" type="numeric" oldValue="30" key="true"/> <field name="firstName" type="string" oldValue="Peter" newValue="Mickey" key="false"/> <field name="lastName" type="string" oldValue="Tork" newValue="Dolenz" key="false"/> </update> </update_packet>
XML 更新数据包中包括以下元素:
transID
:DeltaPacket 生成的唯一标识此事务的 ID。此信息应附带在返回到该组件的结果数据包中。delete
:此类型的节点包含有关被删除的行的信息。insert
:此类型的节点包含有关被添加的行的信息。update
:此类型的节点包含有关被修改的行的信息。 id
:唯一标识事务内的操作的编号。此信息应附带在返回到该组件的结果数据包中。newValue
:此属性包含被修改的字段的新值。只有在字段值改变时,此属性才会出现。key
:如果应使用字段查找要更新的行,则此属性为 true
。此值由 RDBMSResolver 组件的 updateMode
参数、fieldInfo.isKey
设置和操作的类型(插入、删除或更新)共同确定。下表描述如何确定这些关键属性值。如果使用 RDBMSResolver 组件的 fieldInfo
参数将某个字段定义为关键字段,它将始终出现在更新数据包中,并且 key="true"
。否则,更新数据包中字段的 key 属性将根据下表进行设置:
节点类型 |
umUsingKey |
umUsingModified |
umUsingAll |
---|---|---|---|
delete |
|
|
|
insert |
|
|
|
update |
|
如果字段被修改,则为 |
|
服务器完成更新数据包之后,不管成功与否,它都应发送回一个包含错误或附加更新(由更新操作产生)的结果数据包。在没有消息的情况下应该仍会发送结果数据包,但该数据包将没有操作结果节点。
下面是 RDBMSResolver 组件结果数据包的一个示例(同时包含更新结果和更改信息节点):
<results_packet nullValue="{_NULL_}" transID="46386292065:Wed Jun 25 15:52:34 GMT-0700 2003"> <operation op="delete" id="11295627479" msg="The record could not be found"/> <delete> <field name="id" oldValue="1000" key="true" /> </delete> <insert> <field name="id" newValue="20"/> <field name="firstName" newValue="Davey"/> <field name="lastName" newValue="Jones"/> </insert> <operation op="update" id="02938027477" msg="Couldn't update employee."> <field name="id" curValue="105" msg="Invalid field value" /> </operation> <update> <field name="id" oldValue="30" newValue="30" key="true" /> <field name="firstName" oldValue="Peter" newValue="Mickey"/> <field name="lastName" oldValue="Tork" newValue="Dolenz"/> </update> </results_packet>
结果数据包包含四种不同类型的节点:
Operation
节点包含更新数据包中的操作结果。每个操作节点均应具有以下属性/子节点:
op
:描述所尝试操作的类型的属性。必须为 insert、delete 或 update。id
:包含所发出操作节点中的 ID 的属性msg
(可选):包含描述尝试操作时所出现问题的消息字符串的属性field
:提供字段级别特定信息的 0 个、1 个或多个子节点。每个字段节点至少应具有一个 name
属性(包含字段名)和一个 msg
属性(提供字段级别消息)。它还可以根据需要包含 curValue
属性,该属性包含服务器上该行中该字段的最新值。Update
节点包含有关自上次更新客户机后已修改的记录的信息。Update 节点应包含一些子节点,这些子节点列出唯一标识删除的记录所必需的字段,并描述修改的字段。每个字段节点均应具有以下属性:
name
:包含字段的名称oldValue
:包含修改之前字段的旧值。只有在包括了 key 属性并将其设置为 true
时,此字段才是必需的。newValue
:包含应为字段提供的新值。如果未修改字段(也就是说,字段被包括在列表中的原因仅仅在于它是关键字段),则不能包括此字段。key
:包含布尔值 true
或 false
,该值确定是否使用此字段作为关键字在客户机上查找相应记录。应为所有关键字段包括此属性,并将其设置为 true
。对于所有其他字段则是可选的。Delete
节点包括有关自上次更新客户机后已删除的记录的信息。Delete 节点应包含一些子节点,这些子节点列出唯一标识删除的记录所必需的字段。每个字段节点均必须具有一个 name
属性、一个 oldValue
属性以及一个 key
属性(值设置为 true
)。Insert
节点包含有关自上次更新客户机后已添加的记录的信息。Insert 节点应包含一些子节点,这些子节点描述在添加记录时设置的字段值。每个字段节点均必须具有一个 name
属性和一个 newValue
属性。