TBLOBFIELD的内容不能写入到TMEMORYSTREAM,郁闷 ( 积分: 10 )

  • 主题发起人 主题发起人 doloop
  • 开始时间 开始时间
D

doloop

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库是用的ACCESS 2K,字段A是OLE类型

在DELPHI中,使用:
aMemoryStream:TMemoryStream;

TBlobField(A).SaveToStream(aMemoryStream);

调试的时候:aMemoryStream的值总是空,但是却没有错误提示
郁闷啊
 
如果是存时,常用TMemoryStream;
aMemoryStream:= tmemorystream.Create ;//是不是没创建
tblobfield(A).LoadFromStream(aMemoryStream);
aMemoryStream.position :=0;
取时,用TFILESTREAM,或TADOBlobStream,都要先创建,然后position指向0,才能调出STREAM
 
MemoryStream 肯定是创建的了

不过很奇怪,用TBlobField(A).SaveToFile是可以保存成文件的
而且用TBlobField(A).SaveToStream(MS)后,MS再用SaveToFile也是可以保存成正确的文件的
太郁闷啊
 
aMemoryStream:=TMemoryStream.Create;
TBlobField(A).SaveToStream(aMemoryStream);
aMemoryStream.Position := 0; //!!!

ExtractedStream:=TMemoryStream.Create;

VCLZip1:=TVCLZip.Create(Sender);
VCLZip1.ArchiveStream:=aMemoryStream;
VCLZip1.UnZipToStream(ExtractedStream,'aFile.TXT');//ZIP中只有一个aFile.TXT文件
ExtractedStream.Position := 0; //!!!

aTextFile:=TStringList.Create;
aTextFile.LoadFromStream(Extractedstream)
 
自己按F1按了好几天,终于找到了一个“愚蠢”的解决方法了
方法如下:
var
//加入以上两个变量
buf:PChar;
bufSize:Integer;
........
........
aMemoryStream:TMemoryStream;
ExtractedStream:TMemoryStream;
aTextFile:TStingList;
......
aMemoryStream:=TMemoryStream.Create;
TBlobField(A).SaveToStream(aMemoryStream);

ExtractedStream:=TMemoryStream.Create;

VCLZip1:=TVCLZip.Create(Sender);
VCLZip1.ArchiveStream:=aMemoryStream;
VCLZip1.UnZipToStream(ExtractedStream,'aFile.TXT');//ZIP中只有一个aFile.TXT文件

aTextFile:=TStringList.Create;
ExtractedStream.Position:=0;
bufSize:=ExtractedStream.Size;
INC(ExtractedStream);
buf:=AllocMem(bufSize);
ExtractedStream.Read(buf^,bufSize);//晕啊,为会要这样子,直接LoadFromStream不行啊
//aTextFile.LoadFromStream(Extractedstream);//奇怪的是,这个aTextFile.Count总是0
aTextFile.Text:=String(buf^);//这样子就OK啦^^
FreeMem(buf,bufSize);
...........
 
虽然暂时解燃眉之急

但这究竟是为什么会这样子呢???
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部