当来自 2 个不同数据库的 2 个程序共享名称时,如何解决 BizTalk 消息类型冲突?
How to solve BizTalk message type conflict when 2 procedures from 2 different databases share names?
我有两个数据库
- DB1
- 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 并没有错,有时,这是不可避免的,就像这种情况一样。
- 创建两个自定义管道,每个都带有 XmlDisassembler。
- 在每个 XmlDisassembler 中,将文档规范设置为您希望在该端口上处理的规范。
- 部署。
- 将接收管道设置为该位置的自定义管道。
我会避免使用相同的 targetNamespace
和根节点名称部署任何模式 - 但如果您必须将 TypedProcedure
类型与 WCF-SQL/Custom 一起使用,则不能这样做适配器。
解决方法:
- 如果您实际上没有返回输入的结果集,请不要对两者都使用
TypedProcedure
。请记住,您可以根据需要使用 Procedure
或 XmlProcedure
,特别是如果您不处理得到 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
和根节点名称来计算
- 过程所在的架构
- 程序名称
- 结果集的形状(通用、类型或 xml)
对于简单的 BizTalk 方案,另一种方法是使用 CompositeOperation-schema。
这样您就可以避免从存储过程中部署架构。
在 "Composite"-schema 中,您可以添加所有其他受支持的 SQL 操作。
您的发送端口上的操作将是 "CompositeOperation"。
您的 Composite-schema 将如下所示:
Composite Operation
出于开发目的,您仍然可以为存储过程生成架构,因为它将帮助您完成 XSLT,但您不再需要在 BizTalk 中部署它。
另请注意,当使用 BizTalk Mapper 而不是自定义 XSLT 时,此方法将不起作用。
我有两个数据库
- DB1
- 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 并没有错,有时,这是不可避免的,就像这种情况一样。
- 创建两个自定义管道,每个都带有 XmlDisassembler。
- 在每个 XmlDisassembler 中,将文档规范设置为您希望在该端口上处理的规范。
- 部署。
- 将接收管道设置为该位置的自定义管道。
我会避免使用相同的 targetNamespace
和根节点名称部署任何模式 - 但如果您必须将 TypedProcedure
类型与 WCF-SQL/Custom 一起使用,则不能这样做适配器。
解决方法:
- 如果您实际上没有返回输入的结果集,请不要对两者都使用
TypedProcedure
。请记住,您可以根据需要使用Procedure
或XmlProcedure
,特别是如果您不处理得到 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
和根节点名称来计算
- 过程所在的架构
- 程序名称
- 结果集的形状(通用、类型或 xml)
对于简单的 BizTalk 方案,另一种方法是使用 CompositeOperation-schema。 这样您就可以避免从存储过程中部署架构。
在 "Composite"-schema 中,您可以添加所有其他受支持的 SQL 操作。 您的发送端口上的操作将是 "CompositeOperation"。
您的 Composite-schema 将如下所示: Composite Operation
出于开发目的,您仍然可以为存储过程生成架构,因为它将帮助您完成 XSLT,但您不再需要在 BizTalk 中部署它。
另请注意,当使用 BizTalk Mapper 而不是自定义 XSLT 时,此方法将不起作用。