看来这个问题还是我来吧
两种解决方法 希望有益于大家的进步, 其中第儿中方法其实就是yzhshi 的文章 (http://www.delphibbs.com/delphibbs/dispq.asp?LID=737517)
这个人不错, 谢喽! ramble, have a look,please!
从数据库读取文件到本地硬盘和从本地硬盘读取文件到数据库
////////////////////////////////
// 方法一 // //
// TFilestream $ TBlobStream //
////////////////////////////////
//1 .doc保存到数据库
procedure (.doc -> DB)
MemeSize: Integer
Buffer: PChar
MyFile: TFileStream
Stream: TBlobStream
Filename: String
begin
...
Filename:= Opendglg.Filename
MyFile:=FileStream.Create(Filename,fmRead); //只读方式打开文件流
with table1 do begin
stream:= TBlobStream.Create(FielByName('Doc') as TBlobfield, bmReadWrite)
/////////////////////////////////////////////
//doc: 字段名 文件 - - - - -〉 DB
// | |
// 文件流 —————〉 Blob流
/////////////////////////////////////////////
MemSize:=Stream.Size;
Inc(MemSize); //增一字节给结尾NULL
Buffer:=AllocMem(MemSize);
try
Stream.Seek(0,soFormBegining);
//流指针位置放前
Stream.Read(Buffer^,MemSize);
MyFile.Wite(Buffer^,MemSize);
text1.Caption:=...
......
Finally
MyFile.Free
Stream.Free
end
...
end
end
// 从数据库读取文件到本地硬盘并存为 .doc:
procedure (DB -> .doc)
MemeSize: Integer
Buffer: PChar
MyFile: TFileStream
Stream: TBlobStream
Filename: String
begin
...
MyFile:=FileStream.Create('c:/temp.tmp',fmOpenRead);
with table1 do begin
stream:= TBlobStream.Create(FielByName('Doc') as TBlobfield, bmRead)
//只读方式打开文件流
MemSize:=Stream.Size;
Inc(MemSize); //增一字节给结尾NULL
Buffer:=AllocMem(MemSize);
try
Stream.Read(Buffer^,MemSize);
MyFile.Wite(Buffer^,MemSize);
text1.Caption:=...
......
Finally
MyFile.Free
Stream.Free
end
...
if FileExists('c:/temp.doc') then DeleteFile()
if FileExists('c:/temp.tmp') then RenameFile(,)
end
end
在数据库上使用Image二进制字段保存,使用Stream流的方式。
1 .doc保存到数据库的Image字段:
创建文件流:
Word_FileStream:=TFileStream.Create('MyDoc.doc',fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
TBlobField(AdoQuery1.FieldByName(Column_Name)).LoadFromStream(Word_FileStream);
2 从数据库读取文件到本地硬盘并存为 .doc:
Word_FileStream:=TFileStream.Create('Temp.DOC',fmOpenWrite or fmCreate);
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);
释放文件流:
Word_FileStream.Free;
//////////////////////////
// 方法二 //
// TfileStream //
//////////////////////////
在数据库上使用Image二进制字段保存,使用Stream流的方式。
1 .doc保存到数据库的Image字段:
创建文件流:
Word_FileStream:=TFileStream.Create('MyDoc.doc',fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
TBlobField(AdoQuery1.FieldByName(Column_Name)).LoadFromStream(Word_FileStream);
2 从数据库读取文件到本地硬盘并存为 .doc:
Word_FileStream:=TFileStream.Create('Temp.DOC',fmOpenWrite or fmCreate);
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);
释放文件流:
Word_FileStream.Free;