如何在Delphi中使用ADO从TBlobField读取数据?

时间:2017-06-05 09:03:20

标签: delphi ado

我试图使用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错误。我无法弄清楚问题所在。请帮助。

1 个答案:

答案 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中表明,正如提到的减压和图像一样。

其他一些评论:

  1. 完成后,您必须销毁该流。
  2. 通常最好使用ReadBuffer而不是Read,因为如果未读取请求的字节数,ReadBuffer会引发异常。