如何在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
错误。我无法弄清楚问题所在。请帮忙。
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
会引发异常。
获取编译错误元素0无法访问 - 在Stream.Read(Result [0],Stream.Size)行使用'Length'或'SetLength'; –
不能与你可以在这里看到的代码。在我的回答中使用代码而不是破坏的代码。不要只是在我的答案中随机选择部分代码,并将它们应用于您的代码。编程不会那样工作。完整地使用答案中的函数。注意一个字节数组不是字符串的事实。 –
我的BlobField Conatins TextData。我在uCompression单元中找到了一个函数DecompressBlobField(AField:TBlobField):String;超载; var SourceStream:TBlobStream; 开始 CheckAssigned(AField,NoBlobFieldMsg); SourceStream:= TBlobStream.Create(AField,bmRead); 尝试 结果:= DecompressStream(SourceStream);最终 SourceStream.Free; 结束; 结束;该函数如何能够返回一个字符串?其实我想结果作为一个字符串。 –
你在哪里销毁(免费)'BLOBStream'对象?你在哪里设置“结果”大小? –