我正在嘗試逐步將遺留應用程序引入當前技術。我有一個在服務器上使用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 +對象。我希望這可以幫助其他需要以便宜的增量更新技術的人。
必須在客戶端編寫XML文件不是表現性的,也不是期望的。是的,我已經使用JSON庫完成了此操作。它需要VB6應用程序的工作,由於所代表的工作量的大小,這引發了推遲。 – BillyD
作爲更新,我試圖只更改流到ADODB.Stream對象。它正在前進一點,所以我預計這將是公認的答案。但是我不知道爲什麼現在出現錯誤必須解決這個問題。我會更新,因爲我知道了。 – BillyD
這使我朝着正確的方向發展,所以我會將它標記爲答案,儘管它並不完整。 – BillyD