2017-10-18 2 views
0

従来のアプリケーションを徐々に最新の技術に移行しようとしています。私は、サーバー上でADOを使用するC + + COM +ライブラリを持っています。 VB6アプリケーションは、前述のライブラリに基づくCOM +オブジェクトのRecordsetを使用しています。 COM +レイヤーを削除したいので、ASP.NET Web APIプロジェクトタイプのReST Webサービスを作成しました。 C#に組み込まれたHTTP結果(つまり、OKとBadRequest)を使用する他のデータ型と同じように、Recordsetを返すようには見えません。私はRecordsetの永続性によってこれを達成しようとしてきました。私は取得するには、最後の行にADODB.RecordsetをReST呼び出しからADODB.Recordsetとして返します。

_Recordset ret = null; 
string strResponse = string.Empty; 
Does things to call out to the ReST web service... 
ret = new Recordset(); 
byte[] rsByteArray = Encoding.ASCII.GetBytes(strResponse); 
ret.Open(new MemoryStream(rsByteArray)); 

ADODB._Recordset rs; 
string rsString; 
SomeLibrary sl = new SomeLibrary(); 
rs = (ADODB._Recordset)sl.SomeMethod(); 
Stream stream = new Stream(); 
rs.Save(stream, PersistFormatEnum.adPersistXML); 
rs.Close(); 
rsString = stream.ReadText(); 
return Ok(rsString); 

C#クライアントは、これはADOレコードセットを永続化し、そのようなオブジェクトを再作成取るしようとします:次のように私はストリームとしてレコードセットを保存します次のエラー:

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

永続化XMLは、次のようになります。

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:rs='urn:schemas-microsoft-com:rowset' xmlns:z='#RowsetSchema'> 
<s:Schema id='RowsetSchema'> 
    <s:ElementType name='row' content='eltOnly' rs:CommandTimeout='600' rs:ReshapeName='DSRowset1'> 
     <s:AttributeType name='ID' rs:number='1'> 
      <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true' rs:maybenull='false'/> 
     </s:AttributeType> 
     <s:AttributeType name='c1' rs:name='Some Date' rs:number='2' rs:nullable='true'> 
      <s:datatype dt:type='dateTime' rs:dbtype='timestamp' dt:maxLength='16' rs:scale='3' rs:precision='23' rs:fixedlength='true'/> 
     </s:AttributeType> 
     <s:AttributeType name='Status' rs:number='3' rs:nullable='true'> 
      <s:datatype dt:type='ui1' dt:maxLength='1' rs:precision='3' rs:fixedlength='true'/> 
     </s:AttributeType> 
     <s:AttributeType name='c3' rs:name='File Name' rs:number='4' rs:nullable='true'> 
      <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='2000'/> 
     </s:AttributeType> 
     <s:AttributeType name='c4' rs:name='User ID' rs:number='5'> 
      <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='32' rs:maybenull='false'/> 
     </s:AttributeType> 
     <s:extends type='rs:rowbase'/> 
    </s:ElementType> 
</s:Schema> 
<rs:data> 
<z:row ID='3319' c1='2017-06-26T08:14:46' Status='2' 
    c3='somefile.XML' c4='domain\\user'/> 
</rs:data> 
</xml> 

目的は、COM +ライブラリの代わりに新しいC#ライブラリへの新しい参照以外の実装が変更されたことを決して知らないように、VB6アプリケーションに返すADOレコードセットを持つことです。

私が書いたものにバグはありますか?これはちょうど不可能ですか?可能でない場合、誰かがこの作業を達成するために取ることができる別の道を知っていますか?

編集:
この質問に対する回答は間違いなく役に立ちました。私は最終的にそれが働いて得たとき、私は次のようにサーバを変更:

ADODB.Stream stream = new ADODB.Stream(); 
rs.Save(stream, PersistFormatEnum.adPersistXML); 
rs.Close(); 
rsString = stream.ReadText(); 
return Ok(rsString); 

そしてクライアント次へ:それはからそれを受け取ったかのように

_Recordset ret = null; 
string strResponse = string.Empty; 
Does things to call out to the ReST web service... 
if (!string.IsNullOrEmpty(strResponse)) 
{ 
    strResponse = strResponse.Replace("\\t", " ").Replace("\\r\\n", " ").Replace("\"", ""); 
    ret = new Recordset(); 
    ADODB.Stream stream = new ADODB.Stream(); 
    stream.Open(); 
    stream.WriteText(strResponse); 
    stream.Position = 0; 
    ret.Open(stream); 
} 

return ret; 

VB6モジュールは現在、データを受け入れることができますCOM +オブジェクト。私はこれが安価な増分で彼らの技術を更新する必要がある他の誰かを助けることを望む。あなたが好きなレコードセットオープン方法でADODB.Streamオブジェクトを渡す必要があります

答えて

0

:(Streamオブジェクトを使用して)

ADODB.Stream strm = new ADODB.Stream(); 
strm.Open(); 
strm.LoadFromFile(@"D:\XMLRecordset.xml"); 
Recordset rs = new Recordset(); 
rs.Open(strm); 

しかし、上記のようにうまく機能していない - いけないし、なぜ知っています。あなたがレコードセットに対処したくない場合は、あなたがウェブAPIからオブジェクトのリストを渡し、VB6アプリケーションでJSON文字列を解析することができます。また

Recordset rs = new Recordset(); 
rs.Open(@"D:\XMLRecordset.xml"); 

:しかし、あなたは次のようにレコードセットを開くには、ファイルパスを使用することができますし、動作します結果を得るために(012からの答えをチェックしてください。Is There a JSON Parser for VB6/VBA?

+0

クライアント側でXMLファイルを書くことは、パフォーマンスが良くないことも望ましくありません。はい、JSONライブラリでこれを行いました。これは、表現された作業の量のためにプッシュバックを促したVB6アプリケーションの作業を必要としました。 – BillyD

+0

アップデートとして、ストリームをADODB.Streamオブジェクトに変更しようとしています。それは少し前進しているので、これが受け入れられる答えになると思います。しかし、私は今なぜこのエラーの問題に関係していると誤解しているのか分かりません。私はそれを把握するように私は更新されます。 – BillyD

+0

これは私を正しい方向に送ったので、完全ではないが、答えとしてフラグを立てるつもりです。 – BillyD

関連する問題