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