最近在學習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