如何在 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;
最好使用 TDataSet
的 CreateBlobStream
方法创建 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
会引发异常。
我正在尝试使用 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;
最好使用 TDataSet
的 CreateBlobStream
方法创建 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
会引发异常。