【发布时间】: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 列重复或不按顺序排列。每列只能选择一次,并且必须按顺序选择列。
我试过以下没有运气
- 将 SELECT 请求对象从 * 更新为特定的列名 按顺序
- 通过 WCF 向导重新生成 XSD 架构
- 安装了最新的 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