Тип данных параметра запроса изменен на WideString в приложении SOAP - PullRequest
0 голосов
/ 03 января 2012

У меня есть простое приложение SOAP: Средний уровень: TSOAPDataModule, включая TDatasetProvider, связанный с TADOQuery. TADOQuery определил несколько параметров (разные типы данных) Клиент: TClientDataSet связан с TSOAPConnection, а провайдеру присвоено значение DatasetProvider в MiddleTier.

Во время разработки я могу успешно получить параметры и поля для ClientDataSet с сервера. Во время выполнения я программно устанавливаю параметры для ClientDataSet и вызываю Open. Но я получаю ошибку SQL (поступающую с SQL Server через ADOQuery на среднем уровне, передаваемую SOAP клиенту) о неправильных значениях параметров. После детальной отладки я обнаружил, что параметры правильно передаются от клиента к SOAP-серверу. Provider.Params правильно перечисляет все параметры. К сожалению, до открытия ADOQuery (после назначения ADOQuery.Parameters из DataSetProvider) DataType всех параметров изменяется. т.е.: исходный параметр ADOQuery DataType был ftDateTime, но после присвоения из DataSetProvider он становится ftWideString.

Это происходит для любого параметра DataType, который не равен NULL для клиента - все они становятся ftWideString.

Я обнаружил, что это изменение происходит в TParam.Assign, где TParameter (Destination) .Value назначается перед TParameter (Destination) .DataType. После присвоения значения DataType автоматически угадывается из varType значения. Поскольку значение происходит из OleVariant, оно всегда считается строкой.

Я попытался изменить процедуру TParam.Assign = Назначить тип данных перед значением. Но при этом я получаю ADO Error of Value, несовместимый с DataType.

Я думаю, что проблема в том, как параметры кодируются в запрос SOAP XML. Их значения просто '{value}' без какой-либо информации о типе.

Я много гуглил для этой проблемы, но не нашел даже примечания о поведении simmillar.

Я что-то не так делаю, или это ошибка в SOAP в Delphi?

PS: я запускаю Delphi 2009

EDIT: Я только что нашел пример SOAP-запроса, параметры которого упорядочены в следующей структуре:

<NS1:V NS2:VarArrayType="8204">
<V xsi:type="xsd:string">param1</V>
<V xsi:type="xsd:string">Frank</V>
<V xsi:type="xsd:byte">1</V>
<V xsi:type="xsd:byte">1</V>
</NS1:V>

То же самое в моем случае выглядит так:

<NS1:V NS2:VarArrayType="8204">
<V>param1</V>
<V>Frank</V>
<V>1</V>
<V>1</V>
</NS1:V>

Я думаю, что это корень моих проблем, но я не знаю, как заставить моего клиента добавить атрибут xsi: type в запрос SOAP.

1 Ответ

1 голос
/ 10 января 2012

Я нашел это.Я зарегистрировал свой SOAPDataModule с

InvRegistry.RegisterInterface(TypeInfo(IMyIntf), MyNamespace, 'UTF-8');
InvRegistry.RegisterInvokeOptions(TypeInfo(IMyIntf), [ioDocument, ioHasNamespace, ioIsAppServerSOAP]);

Включение ioDocument в RegisterInvokeOptions привело к тому, что атрибут xsi: type не был включен в данные типа Variant.Это сделало демаршализацию значений параметров типам olestring.Таким образом, решение моей проблемы:

InvRegistry.RegisterInvokeOptions(TypeInfo(IMyIntf), [ioHasNamespace, ioIsAppServerSOAP]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...