在delphi中三个形式:ADODB_TLB ADOInt ADODB

转自:http://www.mini188.com/showtopic-862.aspx


在delphi中三个形式:ADODB_TLB ADOInt ADODB

 

RecordSet在delphi中常见的转换问题
三个文件中都有,但都不同ADODB_TLB._RecordSet ADOInt._RecordSet ADODB.RecordSet
ADODataSet和ADOQuery只能接受ADOInt._RecordSet,不能接受ADODB_TLB._RecordSet
原生_RecordSet与ADOInt._RecordSet互转,应该可以实现,但我没有去研究。
【第一种应用】RecordSet与OleVariant互转,uses ADODB_TLB,不能用ro的binaryfromvariant,因为这是xml纯广本,不是olevariant 纯文本xml转olevariant会失真。需要用另行处理。
【第二种应用】RecordSet与Binary互转,uses uROTypes uROBinaryHelpers
【第三种应用】RecordSet与String互转,uses ADODB(delpih7自带的)


要点:
1.RecordSet转为String后,再由String变为OleVariant,转回RecordSet,会报错。
2.ADODataSet.RecordSet的值,可以用ADODB.RecordSet转来的RS,但不能用ADODB_TLB._RecordSet
【原生 ADO 与 Delphi ADOExpress 组件的对应关系】
1、Connection <=> ADOConnection.ConnectionObject;
2、Recordset <=> ADODataSet.Recordset;
3、Command <=> ADOCommand.CommandObject;
4、? <=> ADOQuery,因为 ADOQuery 根本就不是原生 ADO 对象
5、ExecSQL <=> ADODataSet.Open;
6、ExecSQLA <=> ADOCommand.Execute;

【第一种应用】RecordSet与OleVariant互转
function SetAdoStream(RDS : ADODB._RecordSet) : OleVariant;
var
Objstream : ADODB_TLB._Stream;
ObjRs1    : ADODB_TLB._RecordSet;
ObjRs2    : OleVariant;
begin
try
    Objstream:=CoStream.Create;
    ObjRs1:=ADODB_TLB.CoRecordset.Create;
    ObjRs2:=CreateOleObject('ADODB.RecordSet');
    ObjRs1:=ADODB_TLB._RecordSet(RDS);
    ObjRs1.Save(ObjStream,adPersistXML);
    ObjRs2.Open(ObjStream);
    Result:=ObjRs2;
    ObjRs1.Close;
    ObjRs1:=nil;
    ObjRs2:=NULL;
    ObjStream:=nil;
except
    Result:=NULL;
    ObjRs1.Close;
    ObjRs1:=nil;
    ObjRs2:=NULL;
    ObjStream:=nil;
end;
end;

function GetAdoStream(oStream : OleVariant) : ADODB._Recordset;
begin
Result:=IDispatch(oStream) As ADODB._RecordSet;
end;




【第二种应用】RecordSet与Binary互转
function RecordsetToTms(const Recordset: ADODB._Recordset; var Stream: Binary): boolean;
var
RS: OleVariant;
begin
Result := false;
if Recordset = nil then Exit;
Stream:=Binary.Create;
try
    RS := CreateOleObject('ADODB.Recordset');
    RS := Recordset;
    RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistADTG);
    Stream.Position := 0;
    Result := true;
except
    on E:Exception do
    begin
      RS:=E.Message;
      Stream:=BinaryFromVariant(RS);
      Result:=False;
    end;
end;
end;
function RecordsetFromTms(Stream: Binary): ADODB._Recordset;
var
RS: OleVariant;
begin
Result := nil;
if Stream.Size < 1 then Exit;
try
Stream.Position := 0;
RS := CreateOleObject( 'ADODB.Recordset');
RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
Result := IUnknown(RS) as ADODB._Recordset;
finally;
end;
end;


【第三种应用】RecordSet与String互转
function RecordsetToXMLString(const Recordset: adoint._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;

function RecordsetFromXMLString(const XML: string): adoint._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 adoint._Recordset;
finally
    Stream.Free;
end;
end;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值