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

How to read Data from a TBlobField using ADO in Delphi?

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

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;

最好使用 TDataSetCreateBlobStream 方法创建 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 会引发异常。