我试图使用TADOBlobStream从TBlobField读取数据。我写了以下函数
function DecompressBlobFieldCustom(AField:TBlobField):String;
var
BLOBStream:TADOBlobStream;
Size:Integer;
begin
BLOBStream:= TADOBlobStream.Create(AField,bmRead);
Size:= BLOBStream.Size;
BLOBStream.Read(Result,Size);
end;
我使用以下功能
Data := DecompressBlobFieldCustom(FldImage);
但是当我尝试if Length(Data) > 0 then
时,我收到Access violation at address XXXX
错误。我无法弄清楚问题所在。请帮助。
答案 0 :(得分:1)
Result
是字符串类型,但blob流在字节数组上运行。尝试将字节数组视为字符串通常是错误的。此外,您没有分配要读取的缓冲区,这是错误的实际原因。
读入这样的字节数组:
function ReadBlobField(Field: TBlobField): TBytes;
var
Stream: TStream;
begin
Stream := TADOBlobStream.Create(Field, bmRead);
try
SetLength(Result, Stream.Size);
if Stream.Size>0 then
Stream.ReadBuffer(Result[0], Stream.Size);
finally
Stream.Free;
end;
end;
最好使用CreateBlobStream
TDataSet
方法创建blob流,如documentation中所述。所以代码会更好:
function ReadBlobField(DataSet: TDataSet; Field: TField): TBytes;
var
Stream: TStream;
begin
Stream := DataSet.CreateBlobStream(Field, bmRead);
try
SetLength(Result, Stream.Size);
if Stream.Size>0 then
Stream.ReadBuffer(Result[0], Stream.Size);
finally
Stream.Free;
end;
end;
我假设数据确实是一个字节数组而不是文本。事实上它被保留在一个blob中表明,正如提到的减压和图像一样。
其他一些评论:
ReadBuffer
而不是Read
,因为如果未读取请求的字节数,ReadBuffer
会引发异常。