全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1576
推到 Plurk!
推到 Facebook!

WORD 無法存到 MS SQL?

答題得分者是:kevin2004
joana
一般會員


發表:35
回覆:70
積分:21
註冊:2005-09-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-03 12:16:26 IP:122.124.xxx.xxx 訂閱
我有搜尋貴站上關於 BLOB之資料,想寫一個 WORD 檔存入 MS SQL2000 之程式, 用的是 Delphi5+ADO
FIELD TYPE 是 IMAGE,如下列之程式, 但為何 Word_FileStream.Size =0,當然檔案也沒存進資料庫
請各位有經驗的高手,幫忙看看,是那裡有弄錯,謝謝!

procedure TForm1.BitBtn4Click(Sender: TObject);
var Word_FileStream : TMemoryStream;
begin
if not openDialog1.Execute then EXIT;


Word_FileStream := TMemoryStream.Create;
Word_FileStream.LoadFromFile(OpenDialog1.FileName);
try
ADOQuery1.insert;
ADOQuery1['SYS_PATH']:=OpenDialog1.FileName;
ADOQuery1['SYS_SIZE']:=Word_FileStream.Size ;
TBlobField(ADOQuery1.FieldByName('SYS_IMAG')).LoadFromStream(Word_FileStream);
ADOQuery1.post;
finally
Word_FileStream.free;
end;

end;
joana
一般會員


發表:35
回覆:70
積分:21
註冊:2005-09-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-12 14:44:59 IP:122.124.xxx.xxx 訂閱
不了解,為何用TMEMORYSTREAM 無法存入資料庫,但用下列程式碼就OK?難到只能用LoadFromFile,
而不能用LoadFromStream嗎?

adoQuery.Close;
adoQuery.SQL.Clear;
adoQuery.Parameters.Clear;
adoQuery.SQL.Add('INSERT INTO [FileTable] (FileData)');
adoQuery.SQL.Add('VALUES (:FileData)');
adoQuery.Parameters.ParamByName('FileData').LoadFromFile('FileName.doc',ftBlob);
adoQuery.ExecSQL;
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-13 13:58:48 IP:61.219.xxx.xxx 訂閱
    ==>試改如下
var
FS : TFileStream ;
begin
if not openDialog1.Execute then
EXIT;
try
FS := TFileStream.Create(OpenDialog1.FileName,fmOpenRead );
ADOQuery1.insert;
ADOQuery1['SYS_PATH']:=OpenDialog1.FileName;
ADOQuery1['SYS_SIZE']:=FS.Size ;
TBlobField(ADOQuery1.FieldByName('SYS_IMAG')).LoadFromStream(FS);
ADOQuery1.post;
...............
------
Kevin
編輯記錄
kevin2004 重新編輯於 2007-05-13 14:02:39, 註解 無‧
kevin2004 重新編輯於 2007-05-13 14:03:15, 註解 無‧
kevin2004 重新編輯於 2007-05-13 14:03:46, 註解 無‧
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-13 14:06:54 IP:61.219.xxx.xxx 訂閱
題外話,順便提一下:
1.你的AdoQuery因有Blob資料,切記要下Where,以免太大量資料被叫到前端
2.此AdoQuery1只能在抓時打開,抓完即關,否則也會影響速度
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-13 14:25:21 IP:61.219.xxx.xxx 訂閱
對不起,小弟看錯你的題意了。你的問題是你的MemoStream碼為何存Blob失敗,而不是要改用別的元件。

我才找出一篇跟你的碼及問題一模一樣的文章,不過沒有結論。
==>http://delphi.ktop.com.tw/topic.php?topic_id=19505

這邊還有一篇類似的,參考一下:
smWH:=TMemoryStream.Create;
Attachment.SaveToStream(smWH);
smWH.Position:=0;
DM.cdsWHDetail_.LoadFromStream(smWH);
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-13 15:14:08 IP:61.219.xxx.xxx 訂閱
經仔細研讀TStream,確定是你未將Postition移好位置所致
==>請看OnLineHelp例
procedure TForm1.Button1Click(Sender: TObject);
var
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;
ListBox1.Items.SaveToStream(TempStream); // write list box contents to the stream
TempStream.Position := 0; // reset to the beginning of the stream
RichEdit1.Lines.LoadFromStream( TempStream); // load stream contents into rich edit control
TempStream.Free;
end;

------
Kevin
joana
一般會員


發表:35
回覆:70
積分:21
註冊:2005-09-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-13 23:16:53 IP:122.124.xxx.xxx 訂閱
謝謝kevin2004的回覆,沒錯,的確是Position 之問題,總算解決我的疑惑,真感謝您熱心的解惑.
正確的程式碼應該如下:

var Word_FileStream : TMemoryStream;
begin
if not openDialog1.Execute then EXIT;

Word_FileStream := TMemoryStream.Create;
Word_FileStream.LoadFromFile(OpenDialog1.FileName);
Word_FileStream.Position := 0;

try
ADOQuery1.insert;
ADOQuery1['SYS_PATH']:=OpenDialog1.FileName;
ADOQuery1['SYS_SIZE']:=Word_FileStream.Size ;
TBlobField(ADOQuery1.FieldByName('SYS_IMAG')).LoadFromStream(Word_FileStream);
ADOQuery1.post;
finally
Word_FileStream.free;
end;

系統時間:2024-05-19 10:15:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!