BizTalk 2010 WCF SQL适配器与SQL Server 2014的兼容性

时间:2016-03-22 13:36:18

标签: sql-server biztalk biztalk-2010 biztalk-2013

我在更新端口时遇到以下错误,该端口使用一直使用SQL 2008的WCF SQL适配器与具有完全相同(非常简单)的表模式的SQL 2014 DB完美配合。

  

适配器无法使用URL“mssql:// XXXXX // XXXXXX?”发送发送到“WcfSendPort_SqlAdapterBinding_TableOp_dbo_XXXXXXXX_Custom”端口的消息。它将在为此发送端口指定的重试间隔后重新传输。详细信息:“Microsoft.ServiceModel.Channels.Common.XmlReaderGenerationException:列CUST_ID和BUSINESS_UNIT_AR在序列中重复或不重复。每列只能选择一次,并且必须按顺序选择列。

我试过以下但没有运气

  1. 将SELECT请求对象从*更新为特定列名称
  2. 通过WCF向导重新生成XSD架构
  3. 安装了最新的BT 2010累积更新包 核心安装和适配器包
  4. 我得出的结论是,BizTalk 2010 WCF SQL适配器可能与SQL Server 2014不兼容。任何人都可以确认这一点和/或建议任何解决方法吗?目前我认为我需要一个自定义的c#组件,并且还计划在不久的将来某个时候进行BizTalk升级。

    这是表格

    CREATE TABLE [dbo].[PS_PAC_CUSCLI_XREF](
        [SETID] [nvarchar](5) NOT NULL,
        [CUST_ID] [nvarchar](15) NOT NULL,
        [BUSINESS_UNIT_AR] [nvarchar](5) NOT NULL,
        [PAC_M_CLIENTCD] [int] NOT NULL,
        [ADDRESS_SEQ_NUM] [int] NOT NULL,
        [PAC_M_ACCOUNT] [nvarchar](4) NOT NULL,
        [PAC_M_SUNCODE] [nvarchar](10) NOT NULL,
        [PAC_M_TAXCNTRY] [nvarchar](5) NOT NULL
    ) ON [PRIMARY]
    

    我正在尝试执行一个非常简单的选择,这是消息

    <ns0:Select xmlns:ns0="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/PS_PAC_CUSCLI_XREF" xmlns:array="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:ns3="http://schemas.microsoft.com/Sql/2008/05/Types/Tables/dbo">
        <ns0:Columns>SETID, CUST_ID, BUSINESS_UNIT_AR, PAC_M_CLIENTCD, ADDRESS_SEQ_NUM, PAC_M_ACCOUNT, PAC_M_SUNCODE, PAC_M_TAXCNTRY</ns0:Columns>
        <ns0:Query>WHERE [CUST_ID] = '0000005341' and [ADDRESS_SEQ_NUM] =     1</ns0:Query>
    </ns0:Select>
    

    我可以看到它在命名空间中使用2008,但这就是使用WCF导入自动生成的方式。

    发送端口绑定几乎是模式生成工具生成的默认设置,但如果您真的需要它可以添加它(它非常大!)。

    运行SQL跟踪后,我确认select语句具有正确的列顺序。但是,此SQL也运行,它似乎以不同的顺序返回表模式。

    exec sp_executesql N'SELECT sp.type AS [ObjectType], modify_date AS [LastModified] FROM sys.all_objects AS sp WHERE (sp.name=@ORIGINALOBJECTNAME and SCHEMA_NAME(sp.schema_id)=@ORIGINALSCHEMANAME);SELECT clmns.name AS [Name], usrt.name AS [DataType], SCHEMA_NAME(usrt.schema_id) AS DataTypeSchemaName, usrt.is_assembly_type AS [IsAssemblyType], clmns.is_identity AS [IsIdentity], ISNULL(baset.name, N'''') AS [SystemType], CAST(CASE WHEN baset.name IN (N''nchar'', N''nvarchar'') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS int) AS [Length], CAST(clmns.[precision] AS int) AS [NumericPrecision], CAST(clmns.[scale] AS int) AS [NumericScale], clmns.is_nullable as [IsNullable], clmns.is_computed as [IsComputed], clmns.is_filestream as [IsFileStream], AT.assembly_qualified_name AS AssemblyQualifiedName, defCst.definition AS [DefaultValue] FROM sys.columns as clmns LEFT OUTER JOIN sys.default_constraints defCst on defCst.parent_object_id = clmns.object_id and defCst.parent_column_id = clmns.column_id LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = clmns.user_type_id LEFT OUTER JOIN sys.types AS baset ON baset.user_type_id = clmns.system_type_id and baset.user_type_id = baset.system_type_id LEFT JOIN sys.assembly_types AT ON AT.[name] = usrt.name AND AT.schema_id = usrt.schema_id WHERE clmns.object_id = (SELECT object_id FROM sys.objects o WHERE o.name=@ORIGINALOBJECTNAME and SCHEMA_NAME(o.schema_id)=@ORIGINALSCHEMANAME)',N'@ORIGINALOBJECTNAME nvarchar(18),@ORIGINALSCHEMANAME nvarchar(3)',@ORIGINALOBJECTNAME=N'PS_PAC_CUSCLI_XREF',@ORIGINALSCHEMANAME=N'dbo'
    

    以下是此查询返回的列的顺序

    • BUSINESS_UNIT_AR
    • PAC_M_ACCOUNT
    • PAC_M_SUNCODE
    • SETID
    • PAC_M_CLIENTCD
    • ADDRESS_SEQ_NUM
    • PAC_M_TAXCNTRY
    • CUST_ID

    我还尝试将数据移动到临时表,删除并重新创建表,然后重新填充,但发生了同样的错误。在上面的语句中返回的列的顺序是不同的,但仍然不是我期望的顺序。 SQL 2008 DB上的相同查询确实以正确的顺序返回数据,因此它可能很重要。不幸的是,它将被嵌入到WCF适配器的源代码中,所以不确定我能做些什么。

1 个答案:

答案 0 :(得分:0)

所以我认为我设法证明虽然BizTalk 2010本身与SQL Server 2014兼容,但官方适配器包中提供的SQL适配器不是,至少不适用于SELECT操作。

以下是一些替代解决方案

  • 使用存储过程
  • 使用其他机制从应用程序中提取数据,例如Web服务。这就是我所做的,因为它可能是最好的做法。
  • 升级到BizTalk 2013或更高版本

请注意,SQL适配器对UPDATE操作确实有效。