私は単純なSOAPアプリケーションを持っています: 中間層:TADOQueryにリンクされたTDatasetProviderを含むTSOAPDataModule。 TADOQueryはいくつかのパラメータ(異なるデータ型)を定義しています クライアント:TSOAPConnectionにリンクされたTClientDataSetとMiddleTierのDatasetProviderに設定されたプロバイダ。SOAPアプリケーションでクエリパラメータのデータ型がWideStringに変更されました
私は、ServerからClientDataSetのParamsとFieldsを正常にフェッチすることができます。実行時に私は、ClientDataSetのパラメータをプログラムで設定し、Openを呼び出します。しかし、私はパラメータの間違った値についてのSQLエラー(SQL Serverから、Middle TierのADOQueryを経由し、SOAPによってクライアントに渡されます)を取得します。詳細なデバッグの後、パラメータがクライアントからSOAPサーバーに正しく渡されることがわかりました。 Provider.Paramsは、すべてのパラメータを正しく一覧表示します。 ADOQueryが開かれる前に不幸にして(ADOQuery.ParametersがDataSetProviderから割り当てられた後)、すべてのパラメータのデータ型が変更されます。すなわち、元のADOQueryパラメータのデータ型はftDateTimeでしたが、DataSetProviderからの割り当て後はftWideStringになりました。
これは、クライアントからのnullではないパラメータデータ型に対して発生します。すべてがftWideStringになります。
この変更は、TParam.Assignで発生し、TParameter(Destination).ValueがTParameter(Destination).DataTypeの前に割り当てられていることがわかりました。値が割り当てられた後、データ型は自動的に値のvarTypeから推測されます。 ValueはOleVariantから来るので、常にStringとみなされます。
私はTParam.Assignプロシージャを変更しようとしました=値の前にデータタイプを割り当てます。しかし、このようにして、私はData Typeと互換性のないADO Error Value型を取得します。
私は、パラメータがSOAP XMLリクエストにエンコードされているという問題があると思います。それらの値は型情報なしの単純に '{value}'です。
私はこの問題のためにたくさんの検索をしましたが、simmillarの動作のメモも見つけられませんでした。
私は何か間違っているのですか、これはDelphiのSOAPのバグですか?
PS:私はEDIT
のDelphi 2009を実行します。 私は、次のような構造でマーシャリングのparamsを持つサンプル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>
同じことが、このように見えますway:
<NS1:V NS2:VarArrayType="8204">
<V>param1</V>
<V>Frank</V>
<V>1</V>
<V>1</V>
</NS1:V>
これは私のトラブルの根源だと思っていますが、私のclを作る方法は分かりませんxsi:type attribugeをSOAPリクエストに追加します。