通过接口如何在Delphi和Vs.net中使用ado的xml数据集(200分)

  • 主题发起人 主题发起人 lajfox
  • 开始时间 开始时间
L

lajfox

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi封装了一个Com+接口,其中有两个函数:
1.GetDatasetData(TableName:WideString;out Rows:WideString):long;
2.SaveDataToTable(Rows,TableName:WideString):long;
我这样实现:
函数1.用ADO连接,用ADO.AdoRecord的Save方法把数据结果集写入一个流,把流转化为
string(delphi的TStringStream流无法返回WideString字符串)字符串。
函数2.接收函数1的Rows,把它转成流,用ADO.AdoRecord的Open方法读入。
现在我遇到的问题就是String和WideString转换的问题,如果rows是string类型则一切正常,
但要命的是接口中只能用WideString,我不知如何解决这个问题,敬请高手帮忙指点,非常着急。

下面是两个中间关键函数的代码:
{
Example:
...
Memo1.Lines.Text:=RecordsetToXML(ADOQuery1.Recordset);
...
}
function RecordsetToXML(const Recordset: _Recordset): String;
var RS: Variant;
Stream: TStringStream;
begin
Result:='';
if Recordset=nil then Exit;
Stream:=TStringStream.Create('');
try
RS:=CreateOleObject('ADODB.Recordset');
RS:=Recordset;
RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistXML);
Stream.Position:=0;
Result:=Stream.DataString;
finally
Stream.Free;
end;
end;

{
Example:
...
ADOQuery1.Recordset:=RecordsetFromXML(Memo1.Lines.Text);
...
}
function RecordsetFromXML(const XML: String): _Recordset;
var RS: Variant;
Stream: TStringStream;
begin
Result:=nil;
if XML='' then Exit;
try
Stream:=TStringStream.Create(XML);
Stream.Position:=0;
RS:=CreateOleObject('ADODB.Recordset');
RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
Result:=IUnknown(RS) as _Recordset;
finally
Stream.Free;
end;
end;

 
问题我已经自己解决了。解决方式如下:
我分析了一下Ado.Recordset的Xml编码格式,发现它是用Uft8编码的,所以把String转换为Uft8(在Delphi中Utf8string=string)编码格式,再编码成UniCode,赋值给中间WideString变量,接口读入时在反编码为Utf8String类型,于是问题解决了。所以在vs.net中使用接口时记得把生成的xml字符串编码成UniCode再传给接口,否则会失败的。
另外,我也实现了传递ADO.Recordset(OleVariant)的接口函数,简单测试后结果挺奇怪:经过多次编码用WideString传递数据集的接口效率竟然比直接用ADO.Recordset(OleVariant)传递数据集的接口效率还高。
 
正是我所需要的,谢谢!!
 
后退
顶部