procedure TForm1.Button1Click(Sender: TObject);
var
ms:TMemoryStream;
data:array[0..1] of single;
begin
if AQData.FieldByName('全血粘度数据').IsNull then exit;
ms:=TmemoryStream.Create;
try
(AQData.FieldByName('全血粘度数据') as TBlobField).SaveToStream(ms);
ms.Position:=0;
ms.ReadBuffer(data[0],sizeof(data));
showmessage(floattostr(data[0]));
showmessage(floattostr(data[1]));
finally
ms.Free;
end;
end;
我是这么写的。
procedure TForm1.Button2Click(Sender: TObject);
var
AStream: TMemoryStream;
AStream2: TStream;
AStrStream: TStringStream;
bytVal: array of Byte;
lsItm_Vol: string;
function StreamToString(mStream: TStream): string; { 将内存流转换成字符串 }
var
I: Integer;
begin
Result := '';
if not Assigned(mStream) then
Exit;
SetLength(Result, mStream.Size);
for I := 0 to Pred(mStream.Size) do
try
mStream.Position := I;
mStream.Read(Result[Succ(I)], 1);
except
Result := '';
end;
end;
function StreamToString2(const Stm: TStream): string;
var
SS: TStringStream; // used to copy stream to string
begin
SS := Classes.TStringStream.Create('');
try
// Copy given stream to string stream and return value
SS.CopyFrom(Stm, 0);
Result := SS.DataString;
finally
SS.Free;
end;
end;
begin
if Edit1.Text = '' then
Exit;
AStream := TMemoryStream.Create;
AStream2 := TStream.Create;
AStrStream := TStringStream.Create('');
try
ADOQuery1.ConnectionString := FConStr;
ADOQuery1.Active := True;
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
AStream.Clear;
TBlobField(ADOQuery1.FieldByName('全血粘度数据')).SaveToStream(AStream);
if AStream.Size = 0 then
continue;
SetLength(bytVal, AStream.Size);
AStream.Position := 0;
AStream.Read(bytVal[0], AStream.Size);
lsItm_Vol := Chr(bytVal[0]) + Chr(bytVal[1]);
WriteLog(lsItm_Vol + #13);
Memo1.Lines.Add(lsItm_Vol);
lsItm_Vol := StreamToString(AStream);
WriteLog(lsItm_Vol + #13);
Memo1.Lines.Add(lsItm_Vol);
lsItm_Vol := StreamToString2(AStream);
WriteLog(lsItm_Vol + #13);
Memo1.Lines.Add(lsItm_Vol);
ADOQuery1.Next;
end;
finally
FreeAndNil(AStream);
FreeAndNil(AStream2);
FreeAndNil(AStrStream);
end;
end;
标准方法是使用TBlobStream来访问Blob字段,如果你感觉繁琐的话,也可以hacking一下:
type
TFloat2 = record
case integer of
0: (LargeInt: Int64);
1: (Float1, Float2: single);
end;
var
F2: TFloat2;
使用:
F2.LargeInt := TBlobField(xxx.FieldByName('...')).AsLargeInt;
然后就可以使用F2.Float1、F2.Float2了。
不过这种方法不保证对所有数据库兼容。