当来自 2 个不同数据库的 2 个程序共享名称时,如何解决 BizTalk 消息类型冲突?

How to solve BizTalk message type conflict when 2 procedures from 2 different databases share names?

我有两个数据库

  1. DB1
  2. DB2

我在这两个数据库中都有一个过程 dbo.Procedure

我正在使用 "Consume Adapter Service" 以便从 BizTalk 执行这些过程。

执行时出现错误:

A response message sent to adapter "WCF-Custom" on Receive Location: xxx... Reason: Cannot locate document specification because multiple schemas matched the message type http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo#Procedure".

如何在不重命名 DB1 或 DB2 中的过程的情况下解决这个问题?

使用相同的 root+namespace 部署 Schemas 并没有错,有时,这是不可避免的,就像这种情况一样。

  1. 创建两个自定义管道,每个都带有 XmlDisassembler。
  2. 在每个 XmlDisassembler 中,将文档规范设置为您希望在该端口上处理的规范。
  3. 部署。
  4. 将接收管道设置为该位置的自定义管道。

我会避免使用相同的 targetNamespace 和根节点名称部署任何模式 - 但如果您必须将 TypedProcedure 类型与 WCF-SQL/Custom 一起使用,则不能这样做适配器。

解决方法:

  • 如果您实际上没有返回输入的结果集,请不要对两者都使用 TypedProcedure。请记住,您可以根据需要使用 ProcedureXmlProcedure,特别是如果您不处理得到 returned 的结果集(例如,如果只有 return 代码或者如果 proc 实际上是 returning XML 例如 SELECT ... FOR XML ...)。事实上,如果您从 proc(s) returning XML,那么您最好使用 XmlProcedure 和强类型模式来获得该结果。如果它们都只是 returning 常规 return 值,我更愿意做...
  • 如果这不起作用,请为一个或两个创建一些包装程序。例如。在 DB1 上创建一个名为 bts.Db1Procedure 的新过程(我喜欢将 BizTalk 特定过程放在一个名为 bts 的模式中,这样 DBA 就会意识到它的用途,但这也可以与 dbo 一起使用) .让此过程采用相同的参数并将它们传递给 dbo.Procedure。 Regenerate/modify 您的模式指向此过程而不是冲突的过程。

要记住的是,适配器使用 targetNamespace 和根节点名称来计算

  1. 过程所在的架构
  2. 程序名称
  3. 结果集的形状(通用、类型或 xml)

对于简单的 BizTalk 方案,另一种方法是使用 CompositeOperation-schema。 这样您就可以避免从存储过程中部署架构。

在 "Composite"-schema 中,您可以添加所有其他受支持的 SQL 操作。 您的发送端口上的操作将是 "CompositeOperation"。

您的 Composite-schema 将如下所示: Composite Operation

出于开发目的,您仍然可以为存储过程生成架构,因为它将帮助您完成 XSLT,但您不再需要在 BizTalk 中部署它。

另请注意,当使用 BizTalk Mapper 而不是自定义 XSLT 时,此方法将不起作用。