현재의 기술로 점차적으로 기존 응용 프로그램을 가져 오려고합니다. 서버에서 ADO를 사용하는 C++ COM + 라이브러리가 있습니다. VB6 응용 프로그램은 위에서 언급 한 라이브러리를 기반으로 COM + 개체의 Recordset을 사용하고 있습니다. COM + 레이어를 제거하여 ASP.NET 웹 API 프로젝트 유형으로 ReST 웹 서비스를 만들었습니다. C#에 내장 된 HTTP 결과 (예 : Ok 및 BadRequest)를 사용하는 다른 데이터 유형처럼 Recordset을 반환 할 수 없습니다. 나는 Recordset 지속성을 통해 이것을 달성하려고 노력 해왔다. 내가 도착, 마지막 줄에ADODB.Recordset을 ReST Call에서 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 레코드 지속 등과 같은 오브젝트를 재 작성 걸릴하려고 다음과 같이 나는 스트림으로 레코드를 저장 다음과 같은 오류 :
<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>
:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
는 지속 된 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 + 개체. 나는이 기술이 저렴한 비용으로 기술을 업데이트해야하는 다른 사람들에게 도움이되기를 바랍니다.
클라이언트 측에서 XML 파일을 작성하는 것은 성능이 좋지도 바람직하지 않습니다. 예, JSON 라이브러리로이 작업을 수행했습니다. 그것은 표현 된 작업의 양으로 인해 푸시 백에 영감을주는 VB6 응용 프로그램에서 작업해야했습니다. – BillyD
업데이트로, 스트림을 ADODB.Stream 개체로 변경하려고합니다. 조금 앞으로 나아가고있어, 이것이 이것이 받아 들일 수있는 대답이 될 것으로 기대합니다. 그러나 나는 왜 그것이 지금이 대답에 대한 문제와 관련이 있는지에 대해 잘못 이해하고 있는지 알지 못합니다. 내가 알아 내면 갱신 할 것이다. – BillyD
이것은 올바른 방향으로 저를 보냈습니다. 그래서 그것이 완료되지는 않았지만 답으로 표시 할 것입니다. – BillyD