首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ADODB.Recordset从ReST调用作为ADODB.Recordset返回

将ADODB.Recordset从ReST调用作为ADODB.Recordset返回
EN

Stack Overflow用户
提问于 2017-10-18 21:06:17
回答 1查看 1.2K关注 0票数 1

我正在尝试将遗留应用程序逐步纳入现有技术。我有一个在服务器上使用ADO的C++ COM+库。VB6应用程序使用来自基于上述库的COM+对象的记录集。我想要删除COM+层,所以我已经使用ASP.NET web项目类型创建了一个ASP.NET Web服务。我似乎无法像使用内置到C#中的HTTP结果返回其他数据类型那样返回记录集(即Ok和BadRequest)。我一直试图通过记录集持久化来实现这一点。我将记录集保存为流,如下所示:

代码语言:javascript
复制
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#客户端尝试接受这个持久化并重新创建对象,如下所示:

代码语言:javascript
复制
_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));

在最后一行中,我得到以下错误:

争论是错误的,超出了可接受的范围,或者相互冲突。

持久化XML如下所示:

代码语言:javascript
复制
<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+库的新引用。

我写的东西有错误吗?还是说这不可能?如果不可能的话,有没有人知道我可以选择一条不同的道路来完成这个任务?

编辑:

这个问题的答案肯定是有帮助的。当我终于让它正常工作时,我将服务器更改为:

代码语言:javascript
复制
ADODB.Stream stream = new ADODB.Stream();
rs.Save(stream, PersistFormatEnum.adPersistXML);
rs.Close();
rsString = stream.ReadText();
return Ok(rsString);

与客户的关系如下:

代码语言:javascript
复制
_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+对象接收数据一样接受数据。我希望这能帮助其他需要以廉价增量方式更新技术的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-19 03:30:24

您需要在记录集打开方法中传递ADODB.Stream对象,例如:

代码语言:javascript
复制
ADODB.Stream strm = new ADODB.Stream();
strm.Open();
strm.LoadFromFile(@"D:\XMLRecordset.xml"); 
Recordset rs = new Recordset();
rs.Open(strm);

但是上面(使用Stream对象)也不起作用--不知道原因。但是,您可以使用文件路径打开记录集,其工作方式如下:

代码语言:javascript
复制
Recordset rs = new Recordset();
rs.Open(@"D:\XMLRecordset.xml");

另外,如果您不想处理记录集,可以从web中传递对象列表,在VB6应用程序中解析JSON字符串以获得结果(请从Is There a JSON Parser for VB6 / VBA?这里查看答案)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46819238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档