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

时间:2017-01-23 19:58:20

标签: c# .net biztalk biztalk-2013

我有两个数据库

  1. DB1
  2. DB2
  3. 我在这两个数据库中都有一个程序dbo.Procedure

    我正在使用"消费适配器服务"为了从BizTalk执行这些过程。

    执行时我收到错误:

      

    发送给适配器的响应消息" WCF-Custom"在接收位置:   xxx ...原因:无法找到文件   规范,因为多个模式匹配消息类型    http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo#Procedure"

    如果不在DB1或DB2中重命名过程,如何解决此问题?

3 个答案:

答案 0 :(得分:1)

使用相同的root +命名空间部署Schema并没有错,有时候,这种情况是不可避免的。

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

答案 1 :(得分:0)

我会避免使用相同的targetNamespace和根节点名称部署任何模式 - 但如果必须将TypedProcedure类型与WCF-SQL / Custom一起使用,则无法执行此操作适配器(一个或多个)。

解决方法:

  • 如果您实际上没有获得键入的结果集,请不要同时使用TypedProcedure。请注意,您可以根据需要使用ProcedureXmlProcedure,特别是如果您未处理返回的结果集(例如,如果只返回代码或proc实际上是返回XML,例如SELECT ... FOR XML ...)。实际上,如果您从proc(s)返回XML,那么最好使用XmlProcedure为该结果使用强类型模式。如果他们只是返回常规回报值,我更愿意做...
  • 如果这不起作用,请为其中一个或两个创建一些包装程序。例如。在名为bts.Db1Procedure的DB1上创建一个新的proc(我喜欢将BizTalk特定的过程放在一个名为bts的模式中,以便DBA意识到它的用途是什么,但这可以用于{ {1}}同样如此)。让此过程采用相同的参数,然后将它们传递给dbo。重新生成/修改您的架构以指向此过程而不是冲突的过程。

要记住的是,适配器使用dbo.Procedure和根节点名称来确定

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

答案 2 :(得分:0)

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

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

您的Composite-schema看起来像这样: Composite Operation

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

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