2012-01-03 7 views
0

私は単純な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リクエストに追加します。

答えて

1

私はそれを見つけました。 type属性は、バリアント型のデータに含まれていない:私はXSIを作っRegisterInvokeOptionsにioDocument含め

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

と私のSOAPDataModuleを登録しています。これにより、param値の文字列のアンマーシャル化が行われました。だから私の問題の解決策は:

InvRegistry.RegisterInvokeOptions(TypeInfo(IMyIntf), [ioHasNamespace, ioIsAppServerSOAP]); 
関連する問題