delphi中操作oleVariant、variant和stream

2022-12-25 12:42:36 作者:admin

本文整理自网络,侵删。

 最近在学习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 上次访问该文件的时间

Delphi中带缓存的数据更新技术

Delphi firedac数据库引擎连接mysql

Delphi listboxadditems() 不重复添加edit1

纯真ip数据库解析Delphi d10.1下正常使用

Delphi获取一个窗口的所有子窗口(包括嵌套)

Delphi 在listview控件中绘底图

base64.pas

Delphi checklistbox简单用法

Delphi动态创建一个ipedit控件

更多相关阅读请进入《Delphi》频道 >>



在线咨询 拨打电话