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

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

问题描述:

我正在尝试使用TADOBlobStream从TBlobField读取数据。我写了下面的功能如何在Delphi中使用ADO读取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

你在哪里销毁(免费)'BLOBStream'对象?你在哪里设置“结果”大小? –

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会引发异常。
+0

获取编译错误元素0无法访问 - 在Stream.Read(Result [0],Stream.Size)行使用'Length'或'SetLength'; –

+0

不能与你可以在这里看到的代码。在我的回答中使用代码而不是破坏的代码。不要只是在我的答案中随机选择部分代码,并将它们应用于您的代码。编程不会那样工作。完整地使用答案中的函数。注意一个字节数组不是字符串的事实。 –

+0

我的BlobField Conatins TextData。我在uCompression单元中找到了一个函数DecompressBlobField(AField:TBlobField):String;超载; var SourceStream:TBlobStream; 开始 CheckAssigned(AField,NoBlobFieldMsg); SourceStream:= TBlobStream.Create(AField,bmRead); 尝试 结果:= DecompressStream(SourceStream);最终 SourceStream.Free; 结束; 结束;该函数如何能够返回一个字符串?其实我想结果作为一个字符串。 –