delphi中操作oleVariant、variant和stream

最近在学习delphi,好多东西都不懂。这几天需要用到用二进制的方式保存和读取oracle中的数据。找了好多帖子才找到我需要的,不过都不全,害我本来就不怎么懂得人弄了好几天。整理一下,供自己和大家以后使用相关操作时借鉴。

首先是oleVariant转成stream,并保存到数据库。我调用的控件函数得到的是一个oleVariant类型,保存只能保存stream,所以只能转换

procedure TForm1.variantToStream();

var

  o: Olevariant;

  p: Pointer;

  s: Stream;

begin

  myControl.saveToStream(o);//这个是我使用的控件的一个函数,是把我需要的二进制数据写入o变量里。类型是OleVariant;

  if o = null then  //不知道这样对不对,网上还说isNull和empry函数,但是我使用都报错。

  begin

    Application.MessageBox('没有得到数据,请核对!', '提示!');

  end;

  saveQuery.SQL.Clear;

  saveQuery.SQL.Text := 'select id,name,content from myTab where 0 = 1';

  saveQuery.open;

  saveQuery.Append;

  saveQuery.FieldByName('id').asString := '01';

  saveQuery.FieldByName('name').asString := '演示';

  p := VarArrayLock(o);

  try

    s:= TMemoryStream.Create;

    s.Position := 0;

    s.WriteBuffer(p^, VarArrayHighBound(o, 1) + 1);

    TBlobField(saveQuery.FieldByName('content')).LoadFromStream(s);

  finally

    VarArrayUnLock(o);

  end;

  saveQuery.Post;

end;

 

下面是stream转换成variant

procedure TFrom1.streamToVariant();

var

  s : TMemoryStream;

  v : Variant;

  p : Pointer;

begin

  s:= TMemoryStream.Create;

  saveQuery.SQL.Clear;

  saveQuery.SQL.Text := 'select content from myTab where i = ''01''';

  saveQuery.open;

  if saveQuery.RecordCount > 0 then

  begin

    (saveQuery.FieldByName('content') as TBlobField).SaveToStream(s);

    v := VarArrayCreate([0, s.Size - 1], varByte);

    p := VarArrayLock(v);

    s.Position := 0;

    s.Read(p^, s.Size);

    VarArrayUnLock(v);

    myControl.OpenStream(v, 2);//这个函数是我控件读取stream的函数,这里只是演示可以直接使用了而已。

  end;

end;



欢迎各位亲们的互粉,新浪微博:http://weibo.com/3313648752

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值