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

as400 存取jpg檔問題

答題得分者是:lu
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-02-14 17:30:03 IP:210.64.xxx.xxx 訂閱
請教各位大大
小弟公司的資料庫是as400 , delphi 7 , 來存取jpg檔,as400 不支援 blob ,所以我們經理開了一個欄位為 longvarchar的型態
,我找過很多種方式,都無法將jpg 檔存入資料庫,請教各位大大有什麼方式可以處理,(除了存檔案路徑之外)
------
ivankuo
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-14 18:45:24 IP:203.73.xxx.xxx 訂閱
轉個彎吧,AS400不能存 binary 的資料,那把 binary 轉成文字再存進去不就可以了?

置於如何把 binary 資料轉換文字資料,方法很多
可以用 Indy 裡面的 TIdDecodeMIME 以及 TIdEncodeMINE ,或是其他東西... base32 , base64 等等等

不過據我所知,AS400的儲存空間單位成本比較高吧,要不要考慮放在其他OS上面,用各連結存取即可

===================引 用 ivankuo 文 章===================
請教各位大大
小弟公司的資料庫是as400 , delphi 7 , 來存取jpg檔,as400 不支援 blob ,所以我們經理開了一個欄位為 longvarchar的型態
,我找過很多種方式,都無法將jpg 檔存入資料庫,請教各位大大有什麼方式可以處理,(除了存檔案路徑之外)
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-15 16:22:04 IP:210.64.xxx.xxx 訂閱

不好意思,小弟原本從網站搜尋文章有提到as400不支援blob,但是我經理把欄位型態改成一個LongVarBinary 的型態,
於是我以下列的方式去處理存取和讀出的動作

[code delphi]
// 存檔
procedure TfmcHA000.bbtOpenClick(Sender: TObject);
var
jpeg: TJpegImage ;
sFileName: String;
begin
inherited;
with cdsGifJpg do
begin
Close;
SQL.Text:= 'SELECT * FROM GIFJPG';
Open;
end;

if OpenPictureDialog1.Execute then
begin

sFileName:= extractfilename(OpenPictureDialog1.FileName);
sFileName:= Trim(Copy(sFileName,1,Pos('.',sFileName)-1));
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
cdsGifJpg.Append;
//檔名
cdsGifJpg.FieldByName('MSGID').AsString:= sFileName;
TBlobField(cdsGifJpg.FieldByName('MSGJPG')).LoadFromFile(OpenPictureDialog1.FileName);
cdsGifJpg.Post;
cdsGifJpg.ApplyUpdates(-1);
end;
end;

procedure TfmcHA000.cdsGifJpgAfterScroll(DataSet: TDataSet);
begin
inherited;
if (cdsGifJpg.RecordCount > 0) and (cdsGifJpg.FieldByName('MSGJPG').AsString<>'') then
begin
TBlobField(cdsGifJpg.FieldByName('MSGJPG')).savetofile(_RootPath cdsGifJpg.FieldByName('MSGID').asstring '.jpg');
Image1.Picture.LoadFromFile(_RootPath cdsGifJpg.FieldByName('MSGID').asstring '.jpg');
deletefile(_RootPath cdsGifJpg.FieldByName('MSGID').asstring '.jpg');
end;

[/code]

此做法發現幾的問題,
1.檔案若太大,會發生欄位被截斷的錯誤,我也才用不到1000K的圖檔,一般若有支援blob的欄位型態,應該可以到2GB吧
2.存入70k左右的圖檔有的會發生,上半部正常顯示,下半段變成灰色,這不知道是什麼原因造成的


經理堅持將圖檔存入資料庫
還在努力找尋答案




===================引 用 lu 文 章===================
轉個彎吧,AS400不能存 binary 的資料,那把 binary 轉成文字再存進去不就可以了?

置於如何把 binary 資料轉換文字資料,方法很多
可以用 Indy 裡面的 TIdDecodeMIME 以及 TIdEncodeMINE ,或是其他東西... base32 , base64 等等等

不過據我所知,AS400的儲存空間單位成本比較高吧,要不要考慮放在其他OS上面,用各連結存取即可

===================引 用 ivankuo 文 章===================
請教各位大大
小弟公司的資料庫是as400 , delphi 7 , 來存取jpg檔,as400 不支援 blob ,所以我們經理開了一個欄位為 longvarchar的型態
,我找過很多種方式,都無法將jpg 檔存入資料庫,請教各位大大有什麼方式可以處理,(除了存檔案路徑之外)
------
ivankuo
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-02-19 16:03:07 IP:203.73.xxx.xxx 訂閱
我猜你是用BDE吧,BDE的BLOB資料有大小限制,DEFAULT是64KB吧,建議改採ADO

BLOB資料的大小,可用 BDE Administrator 來修改,執行BDE Administrator 後,點選 Configuration ,每一種資料庫的驅動程式都可以修改

===================引 用 ivankuo 文 章===================

不好意思,小弟原本從網站搜尋文章有提到as400不支援blob,但是我經理把欄位型態改成一個LongVarBinary 的型態,
於是我以下列的方式去處理存取和讀出的動作

[code delphi]
// 存檔
procedure TfmcHA000.bbtOpenClick(Sender: TObject);
var
jpeg: TJpegImage ;
sFileName: String;
begin
inherited;
with cdsGifJpg do
begin
Close;
SQL.Text:= 'SELECT * FROM GIFJPG';
Open;
end;

if OpenPictureDialog1.Execute then
begin

sFileName:= extractfilename(OpenPictureDialog1.FileName);
sFileName:= Trim(Copy(sFileName,1,Pos('.',sFileName)-1));
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
cdsGifJpg.Append;
//檔名
cdsGifJpg.FieldByName('MSGID').AsString:= sFileName;
TBlobField(cdsGifJpg.FieldByName('MSGJPG')).LoadFromFile(OpenPictureDialog1.FileName);
cdsGifJpg.Post;
cdsGifJpg.ApplyUpdates(-1);
end;
end;

procedure TfmcHA000.cdsGifJpgAfterScroll(DataSet: TDataSet);
begin
inherited;
if (cdsGifJpg.RecordCount > 0) and (cdsGifJpg.FieldByName('MSGJPG').AsString<>'') then
begin
TBlobField(cdsGifJpg.FieldByName('MSGJPG')).savetofile(_RootPath cdsGifJpg.FieldByName('MSGID').asstring '.jpg');
Image1.Picture.LoadFromFile(_RootPath cdsGifJpg.FieldByName('MSGID').asstring '.jpg');
deletefile(_RootPath cdsGifJpg.FieldByName('MSGID').asstring '.jpg');
end;

[/code]

此做法發現幾的問題,
1.檔案若太大,會發生欄位被截斷的錯誤,我也才用不到1000K的圖檔,一般若有支援blob的欄位型態,應該可以到2GB吧
2.存入70k左右的圖檔有的會發生,上半部正常顯示,下半段變成灰色,這不知道是什麼原因造成的


經理堅持將圖檔存入資料庫
還在努力找尋答案




===================引 用 lu 文 章===================
轉個彎吧,AS400不能存 binary 的資料,那把 binary 轉成文字再存進去不就可以了?

置於如何把 binary 資料轉換文字資料,方法很多
可以用 Indy 裡面的 TIdDecodeMIME 以及 TIdEncodeMINE ,或是其他東西... base32 , base64 等等等

不過據我所知,AS400的儲存空間單位成本比較高吧,要不要考慮放在其他OS上面,用各連結存取即可

===================引 用 ivankuo 文 章===================
請教各位大大
小弟公司的資料庫是as400 , delphi 7 , 來存取jpg檔,as400 不支援 blob ,所以我們經理開了一個欄位為 longvarchar的型態
,我找過很多種方式,都無法將jpg 檔存入資料庫,請教各位大大有什麼方式可以處理,(除了存檔案路徑之外)
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-02-21 12:12:44 IP:210.64.xxx.xxx 訂閱
我將BDE的BLOB SIZE調到10240  和 BLOBS TO CASHE 128
目前可以存到1000K以下的檔案,超過的話會有被截斷的error 出現
,用ADO的方式去處理,也差不多只能到1MB,看來只能要求限制圖檔大小,
------
ivankuo
系統時間:2024-04-29 6:19:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!