在BizTalkServer中,与Oracle数据库的交互通常需要通过Oracle适配器来实现。本文将介绍如何配置Oracle适配器,以及如何通过XSLT进行消息映射,以实现数据的标准化处理。
要使BizTalk能够与Oracle数据库进行通信,首先需要配置Oracle适配器。这包括设置传输属性,配置用户名、密码和服务名称(TNS别名),以及Oracle客户端的二进制路径。在Oracle传输属性中,可以通过点击省略号来检查所有属性是否配置正确。此外,还需要设置接收属性为SQLNative。
在项目中,需要添加Oracle适配器元数据以生成相应的架构。执行查询语句后,将返回包含数据的NativeSQL架构类型的消息。如果需要,还可以设置执行查询语句之前的后置查询语句。
建议将Oracle架构项目单独维护,因为如果其他项目使用相同的服务和NativeSQL架构,可能会导致路由失败。
在Visual Studio中创建元数据时,将同时创建多部分消息和端口类型,以及通过选择NativeSQL服务的编排。如果使用单独的项目来维护Oracle适配器元数据和工作项目,请相应地配置端口和多部分消息。
在工作示例中,通过配置消息类型属性并引用Oracle架构项目程序集中的消息部分,创建一个类型为SQLEvent的请求消息。返回的响应消息将是SQLEventResponse类型。
创建一个新的仅接收端口,并将编排中的请求消息的接收形状连接起来。
响应消息并不按照需求进行标准化,包含两个记录:“ColumnMetaData”和“RowMetaData”。ColumnMetaData包含列名,RowMetaData包含数据,但没有预期的列名作为XML标签。因此,需要一个智能映射来标准化它,使其更有用。
最后,可以选择使用XSLT来标准化响应,以满足所需的架构。下面是一个简单的XSLT内联脚本,将SQLEventResponse消息映射到基于IFX的架构消息。需要使用脚本functoid,并使用Inline XSLT Call模板脚本。脚本如下,它将迭代行并将其映射到目标架构记录。
<xsl:template>
<xsl:for-each select="/*[local-name()='SQLExecuteResponse' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]']/*[local-name()='Return' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]']/*[local-name()='rowData' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]']/*[local-name()='columnData' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]']">
<xsl:variable select='position()'/>
<LOG_REFERENCE>
<xsl:value-of select="/*[local-name()='SQLExecuteResponse' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]']/*[local-name()='Return' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]']/*[local-name()='rowData' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]']/*[local-name()='columnData' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]' and position()=$index]/*[local-name()='string' and namespace-uri()='http://schemas.microsoft.com/[OracleDb://OLTPDEV/NativeSQL]' and position()=1]"/>
</LOG_REFERENCE>
</xsl:for-each>
</xsl:template>
通过这种方式,结果是一个标准化的消息,而不是从Oracle适配器返回的消息。