【问题标题】:BizTalk 2010 WCF SQL adapter compatibility with SQL Server 2014BizTalk 2010 WCF SQL 适配器与 SQL Server 2014 的兼容性
【发布时间】:2016-03-22 13:36:17
【问题描述】:

我在将使用 WCF SQL 适配器的端口更新为具有完全相同(非常简单)表架构的 SQL 2014 数据库时,出现以下错误。

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

我试过以下没有运气

  1. 将 SELECT 请求对象从 * 更新为特定的列名 按顺序
  2. 通过 WCF 向导重新生成 XSD 架构
  3. 安装了最新的 BT 2010 累积更新包 核心安装和适配器包

我得出的结论是,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 适配器的源代码中,所以我不确定我能做些什么。

【问题讨论】:

  • 你在运行什么表操作?您是否尝试过运行 SQL Profiler 来捕获正在生成的实际 SQL 语句?如果有,您可以发布实际的请求消息吗?您可以发布表定义(或可以重现此表的定义)吗?
  • 也尝试包含您的发送端口绑定
  • 感谢您的回复。关于 SQL 探查器的好主意,将查看是否显示任何内容。现在包括表模式和请求 XML。发送端口绑定很大,所以没有包含它,但它几乎是一个沼泽标准 WCF-Custom sql 发送端口。
  • 该错误是由适配器引发的,而不是 SQL Server。没有理由假设与 SQL Server 2014 不兼容(没有任何)。对于此特定错误,个重复问题指向适配器本身的错误,例如this one

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


【解决方案1】:

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

这里有一些替代解决方案

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

请注意,SQL 适配器对于 UPDATE 操作确实可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多