Адаптер BizTalk WCF-SQL Выбор из представления

У меня самая раздражающая проблема;

У меня есть оркестровка, выполняющая поиск по представлению. он работает локально и на нашем сервере разработки, но не в QA или UAT. тот же код. одинаковые взгляды. просто разные среды.

Чтобы проверить это и убедиться, что это не проблема с кодом, я беру свой локальный BizTalk, настраиваю порт на сервер A, запускаю сообщение, и все работает, как и ожидалось. Затем я меняю конфигурацию порта отправки на сервер B (это все, что я меняю) и запускаю то же самое сообщение, и оно терпит неудачу.

Я получаю одну из двух ошибок для одной и той же операции для ОДНОГО представления, поэтому даже сообщение об ошибке не соответствует.

Event Type: Warning
Event Source: BizTalk Server 2009
Event Category: (1)
Event ID: 5743
Date:  13/01/2010
Time:  16:53:07
User:  N/A
Computer: VM-RC-BTS2009
Description:
The adapter failed to transmit message going to send port "AX Lookup CRM_CUST" with URL "mssql://server//db?". It will be retransmitted after the retry interval specified for this Send Port. 
Details:"Microsoft.ServiceModel.Channels.Common.XmlReaderGenerationException:
The columns BANKACCOUNTRECID and BLOCKED are either duplicated or not in a sequence. Each column can only be selected one time, and columns must be selected in sequence.
   at Microsoft.Adapters.Sql.SelectBodyWriter.OnWriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.BodyWriter.WriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.Message.WriteBodyContents(XmlDictionaryWriter writer)
   at Microsoft.Adapters.AdapterUtilities.AdapterMessage.OnWriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.Message.WriteBodyContents(XmlDictionaryWriter writer)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfMarshaller.CreateBizTalkMessageStream(Message wcfMessage, IAdapterConfigInboundMessageMarshalling config)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfMarshaller.CreateBizTalkMessage(IBaseMessageFactory messageFactory, IAdapterConfigInboundMessageMarshalling marshallingConfig, Message wcfMessage)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.RequestCallback(IAsyncResult result)".

Or

Event Type: Warning
Event Source: BizTalk Server 2009
Event Category: (1)
Event ID: 5743
Date:  13/01/2010
Time:  16:45:49
User:  N/A
Computer: VM-RC-BTS2009.ad.integralgroup.co.nz
Description:
The adapter failed to transmit message going to send port "AX Lookup CRM_CUST" with URL "mssql://vm-lesmillsnzqa.aplplus.local//LMNZ_AX_Improve?". It will be retransmitted after the retry interval specified for this Send Port. 
Details:"Microsoft.ServiceModel.Channels.Common.XmlReaderGenerationException:  
The columns ACCOUNTNUM and BANKACCOUNTRECID are either duplicated or not in a sequence. Each column can only be selected one time, and columns must be selected in sequence.
   at Microsoft.Adapters.Sql.SelectBodyWriter.OnWriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.BodyWriter.WriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.Message.WriteBodyContents(XmlDictionaryWriter writer)
   at Microsoft.Adapters.AdapterUtilities.AdapterMessage.OnWriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.Message.WriteBodyContents(XmlDictionaryWriter writer)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfMarshaller.CreateBizTalkMessageStream(Message wcfMessage, IAdapterConfigInboundMessageMarshalling config)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfMarshaller.CreateBizTalkMessage(IBaseMessageFactory messageFactory, IAdapterConfigInboundMessageMarshalling marshallingConfig, Message wcfMessage)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.RequestCallback(IAsyncResult result)".
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

Я прошу <Columns>*</Columns> и <Query>WHERE FIELD='xyz'</Query>

Вот фактическое сообщение;

<ns0:Select xmlns:ns3="http://schemas.microsoft.com/Sql/2008/05/Types/Views/dbo" xmlns:ns0="http://schemas.microsoft.com/Sql/2008/05/ViewOp/dbo/CRM_CUST">
<ns0:Columns>*</ns0:Columns>
<ns0:Query>WHERE ACCOUNTNUM='id_0'</ns0:Query>
</ns0:Select> 

Затем у меня есть порт отправки TwoWay Wcf-Custom с sqlbinding. Вот конфиг

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="mssql://devserver//DbName?" behaviorConfiguration="EndpointBehavior" binding="sqlBinding" bindingConfiguration="sqlBinding" contract="BizTalk" name="CUST Lookup" />
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="EndpointBehavior" />
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <sqlBinding>
        <binding name="sqlBinding" useAmbientTransaction="false" />
      </sqlBinding>
    </bindings>
  </system.serviceModel>
</configuration>

И эта настройка в отображении действий;

ViewOp/Select/dbo/CRM_CUST -- имя представления


person ryancrawcour    schedule 13.01.2010    source источник


Ответы (2)


Так; отказавшись от операции «Выбор из представления», которая должна быть простой, и подозревая, что есть проблема с кодом для этой конкретной части адаптера, я решил попробовать «трюк».

Я создал хранимую процедуру, которая просто выполняет SELECT * FROM VIEW WHERE ID = @Param (то же самое представление, которое ранее вызывало проблемы), где Param — это AccountNum, который я передал критериям ViewOp.

Затем использовал мастер адаптера для создания схем для операции TypeStoredProcedure вместо ViewOp. Изменил карту для создания этого нового сообщения. Redploy И вуаля... теперь я могу с радостью переключаться между двумя средами без каких-либо ошибок!

это ясно говорит мне, что есть проблема с частью ViewOp адаптера SQL!?!? У кого-нибудь есть другие идеи / объяснения, почему это происходит, кроме проблемы с адаптером?

Я знаю, что большинство людей говорят, что не следует использовать представления и вместо этого использовать хранимые процедуры, но есть очень веская причина, по которой мы используем представления. Мы выбираем базу данных Microsoft Dynamics AX. AX публикует эти представления для использования внешними системами. Microsoft не поддерживает создание хранимой процедуры для схемы AX, поскольку она изменяет их базу данных. То же самое происходит, если бы мы использовали Views в CRM, мы не можем создавать хранимые процедуры по желанию.

Так что решение, которое у меня есть сейчас, может работать, но оно не поддерживается. Это придется пока оставить, пока мы не решим эту проблему.

person ryancrawcour    schedule 13.01.2010

Недавно я столкнулся с той же проблемой. Проведя день, я наконец запустил SQL Profiler и нашел причину. По какой-то причине в некоторых БД, включая БД Ax2009, существует разница в порядке столбцов, перечисленных в представлении, и порядке столбцов, который требуется biztalk. Он выполняет следующий код и хочет, чтобы столбцы были в точном порядке («*» вам не подойдет):

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], 0 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(13),@ORIGINALSCHEMANAME nvarchar(3)',@ORIGINALOBJECTNAME=N'CRM_CFU',@ORIGINALSCHEMANAME=N'dbo'

Просто замените значение @ORIGINALOBJECTNAME именем вашего представления и поместите столбцы в свой выбор в точном порядке.

person Dmitry Golubets    schedule 08.07.2011
comment
@ryancrawcour: Если это отвечает на ваш вопрос, вы должны пометить его как принятый ответ. - person Drew Gaynor; 09.11.2013