频道分类

delphi中操作oleVariant、variant和stream

作者:admin 来源: 日期:2020/5/29 13:38:01 人气: 标签:

 
最近在学习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;
————————————————

原文链接:https://blog.csdn.net/leandzgc/article/details/7568623

上一篇:delphi – 使用CreateOleObject后释放OleVariant下一篇:没有资料