2017-10-18 128 views
0

我正在嘗試逐步將遺留應用程序引入當前技術。我有一個在服務器上使用ADO的C++ COM +庫。 VB6應用程序正在使用基於上述庫的COM +對象中的Recordset。我想刪除COM +層,因此我使用ASP.NET Web API項目類型創建了ReST Web服務。我似乎無法像使用內置於C#中的HTTP結果(即Ok和BadRequest)的其他數據類型那樣返回Recordset。我一直試圖通過Recordset持久性來實現這一點。我的記錄保存爲流如下:將ADODB.Recordset從ReST Call中作爲ADODB.Recordset

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記錄集並重新創建像這樣的對象:

_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)); 

就上線,我得到以下錯誤:

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> 

目的是讓ADO記錄集發送回VB6應用程序,以便它永遠不會知道實現發生了變化,而不是對新的C#庫而不是COM +庫的新引用。

在我寫的或者這是不可能的嗎?如果不可能,是否有人知道我可以嘗試完成此任務的不同路徑?

編輯:
這個問題的答案是絕對有幫助的。當我終於得到它的工作,我改變了服務器到以下幾點:

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 +對象。我希望這可以幫助其他需要以便宜的增量更新技術的人。

回答

0

你需要傳遞ADODB.Stream對象在記錄open方法,如:

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

但以上(使用Stream對象)不工作,以及 - 不知道爲什麼。但是你可以使用文件路徑打開記錄,並會像:

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

此外,如果你不想處理的記錄,你可以從網上API和VB6應用解析JSON字符串傳遞對象的列表以獲得結果(檢查來自Ben的答案Is There a JSON Parser for VB6/VBA?

+0

必須在客戶端編寫XML文件不是表現性的,也不是期望的。是的,我已經使用JSON庫完成了此操作。它需要VB6應用程序的工作,由於所代表的工作量的大小,這引發了推遲。 – BillyD

+0

作爲更新,我試圖只更改流到ADODB.Stream對象。它正在前進一點,所以我預計這將是公認的答案。但是我不知道爲什麼現在出現錯誤必須解決這個問題。我會更新,因爲我知道了。 – BillyD

+0

這使我朝着正確的方向發展,所以我會將它標記爲答案,儘管它並不完整。 – BillyD

相關問題