У меня есть простое приложение 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.