如何用DELPHI實現把WORD、EXCEL和圖片等儲存到資料庫中
var
word_stream: TMemoryStream;
filename: string;
begin
if odgDoc.Execute then//odgDoc:OpenDialog
begin
filename := ExtractFileName(odgDoc.FileName);
word_stream := TMemoryStream.Create;
word_stream.LoadFromFile(odgDoc.FileName);
word_stream.Position := 0;
cdsPACT.Append
cdsPACT.FieldByName('DocName').Value := filename;
TBlobField(cdsPACT.FieldByName('PactText')).LoadFromStream(word_stream);
cdsPACT.Post;
word_stream.Free;
end;
end;
---- 目前,Delphi被越來越多的人選中作為MIS系統開發中的前臺工具。在以Delphi為前臺,一些大型資料庫為後臺的MIS系統中,圖形的處理不可避 免;即從以Delphi開發的前臺介面輸入圖形,並儲存到相應的資料庫欄位中。在這種形式的圖形處理中,BMP檔案的處理比較簡單,因為Delphi本身 有Image和DBImage構件,用這些構件與資料庫中可以儲存圖形的大型欄位BLOB比較容易地進行資料交換。以這種方式進行圖形處理已應用在許多 MIS軟體中,包括處理人員照片的人事檔案系統等。
---- 但是,BMP檔案一般都比較大。而且有時要錄入的是自己在計算機上畫的簡圖,並伴隨大量文字說明。這種情況用Win95中的畫圖板等處理BMP檔案的工具 處理就比較困難。一般應用人員都喜歡用WORD畫圖和寫說明文字,然後儲存到資料庫中。
---- 經過一段時間的摸索,我們解決了這個問題,並經過完善,在應用中執行較好。程式如下:
procedure TsampleForm.OpenDOCClick(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
Myfile: TFileStream;
Stream: TBlobStream;
begin
OpenDialog1.Filter:='WORD文件(*.DOC)|*.DOC';{從對話窗選擇檔案}
if OpenDialog1.Execute then
begin
Myfile:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
with table1 do {‘table1’為含BLOB欄位的表名}
begin
Open;
Edit;
Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmWrite);{‘Doc’為BLOB欄位名}
MemSize := MyFile.Size;
Inc(MemSize); {Make room for the buffer's null terminator.}
Buffer := AllocMem(MemSize); {Allocate the memory.}
try
Stream.Seek(0, soFromBeginning); {Seek 0 bytes from the stream's end point}
MyFile.Read(Buffer^,MemSize);
Stream.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
try
Post;
except
on E: EDatabaseError do
if HandelException(E)< >0 then
exit
else
raise;
end;
end;
Doc_ole.CreateObjectFromFile(OpenDialog1.FileName,False);
Doc_ole.Run;{Doc_ole為ToleContainer構件名}
end;
end;
---- 以上為向資料庫中寫入的程式,應用中從對話窗取出檔案在ToleContainer構件中顯示的同時存入資料庫。
procedure TsampleForm.GetDocClick(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
Myfile: TFileStream;
Stream: TBlobStream;
begin
Myfile:=TFileStream.Create('c:/temp.tmp',fmCreate);
with Query1 do
begin
Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmRead);
MemSize := Stream.Size;
Inc(MemSize); {Make room for the buffer's null terminator.}
Buffer := AllocMem(MemSize); {Allocate the memory.}
try
Stream.Read(Buffer^,MemSize);
MyFile.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
end;
if FileExists('c:/temp.DOC') then
DeleteFile('c:/temp.DOC');
if FileExists('c:/temp.tmp') then
begin
RenameFile('c:/temp.tmp', 'c:/temp.DOC');
Doc_ole.CreateObjectFromFile('c:/temp.DOC',False);
Doc_ole.Run;
end;
end;
---- 以上程式為從資料庫從將WORD文件取出,並放在temp.doc的臨時檔案上並在ToleContainer構件中顯示。
---- 在程式的其他部份應準確控制表記錄指標,使WORD文件的存取發生在正確的記錄位置。