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

請問相片如何透過Timage元件存取SQLserver?

答題得分者是:cancer
evan690222
一般會員


發表:2
回覆:5
積分:1
註冊:2011-04-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-04-22 17:25:38 IP:122.117.xxx.xxx 訂閱
各位大大們,
小弟遇到相片處理的問題,
請大家協助我一下,謝謝。

環境述敘:
使用Delphi2009開發
配合SQL Server 2005為資料庫,
現在我使用Timage元件,
想要存進資料庫,
並在每次瀏覽資料時,
可以看到之前我所存的相片。

問題:
1.請問資料庫要設什麼資料型別?
2.在開發上,我怎麼寫程式?


boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-04-22 17:43:50 IP:60.250.xxx.xxx 訂閱
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-04-22 19:52:10 IP:220.128.xxx.xxx 未訂閱
Hello,文章好像放錯地方了。
把舊程式拿出來整理一下給您。下面是 jpg 範例,如果允許讀 bmp 檔,則上傳前要轉為 jpg,以節省資料庫空間,並減少下載時的程式複雜度。

資料庫:Sql Server 2005
資料表:二進位資料'
欄位: 資料流' varbinary(MAX)

一。讀檔,上傳,顯示

var ms : TMemoryStream;
jpg : TJpegImage;
FileStream: TFileStream;
BlobStream: TStream;
// DataSet 是 TAdoDataSet 在 TForm 上面
begin
OpenPictureDialog1.Filter := '*.jpg|*.jpg|*.jpeg|*.jpeg";
if OpenPictureDialog1.Execute = false then exit;

Ms := TMemoryStream.Create;
jpg := TJpegImage.Create;

DataSet.Close;
DataSet.CommandText := 'select top 0 * form 二進位資料';
DataSet.Open;

BlobStream := DataSet..CreateBlobStream(DataSet.FieldByName('資料流'),bmWrite);
FileStream := TFileStream.Create(OpenPictureDialog1.FileName,fmOpenRead or fmShareDenyNone);
BlobStream.CopyFrom(FileStream, FileStream.Size); // 會填入 [資料流'] 欄位

FileStream.Free;
BlobStream.Free;
DataSet.Post;

// 讀檔上傳順便顯示, 給 Image1 顯示圖形(用 TJpegImage 轉換)
TGraphicField(DataSet.FieldByName('資料流')).SaveToStream(Ms);
Ms.Position := 0; // 設為 0,否則會出錯
jpg.LoadFromStream(Ms);
Image1.Picture.Bitmap.Assign(jpg);
DataSet.Close;
Ms.Free;
Jpg.Free;
end;

二、下載,顯示
var ms : TMemoryStream;
jpg : TJpegImage;
begin
DataSet.Close;
DataSet.CommandText := 'select top 1 * from 二進位資料';
DataSet.Open;
if DataSet.RecordCount > 0 then
begin
Ms := TMemoryStream.Create;
TGraphicField(DataSet.FieldByName('資料流')).SaveToStream(Ms);
Ms.Position := 0; // 一定要設為 0,否則 jpg 產生錯誤
jpg := TJpegImage.Create;
jpg.LoadFromStream(Ms);
Image1.Picture.Bitmap.Assign(jpg);
jpg.Free;
Ms.Free;
end;
DataSet.Close;
end;
編輯記錄
cancer 重新編輯於 2011-04-22 05:53:23, 註解 無‧
cancer 重新編輯於 2011-04-22 05:54:48, 註解 無‧
cancer 重新編輯於 2011-04-25 19:59:44, 註解 無‧
cancer 重新編輯於 2011-04-25 20:00:51, 註解 無‧
evan690222
一般會員


發表:2
回覆:5
積分:1
註冊:2011-04-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-04-25 13:26:10 IP:114.33.xxx.xxx 訂閱
抱歉,第一次po文,下次會注意。
首先謝謝您的回答,
我現在正在測試了,
但遇到一下問題,
語法中的dsImage,
一直compile不 過,
而且一直有紅色底線,
它跟我說Undeclared identifier :'dsImage"
我是不是少了什麼東西呢?



===================引 用 cancer 文 章===================
Hello,文章好像放錯地方了。
把舊程式拿出來整理一下給您。下面是 jpg 範例,如果允許讀 bmp 檔,則上傳前要轉為 jpg,以節省資料庫空間,並減少下載時的程式複雜度。

資料庫:Sql Server 2005
資料表:二進位資料'
欄位: 資料流' varbinary(MAX)

一。讀檔,上傳,顯示

var ms : TMemoryStream;
jpg : TJpegImage;
FileStream: TFileStream;
BlobStream: TStream;
begin
OpenPictureDialog1.Filter := '*.jpg|*.jpg|*.jpeg|*.jpeg";
if OpenPictureDialog1.Execute = false then exit;

Ms := TMemoryStream.Create;
jpg := TJpegImage.Create;

DataSet.Close;
DataSet.CommandText := 'select top 0 *form 二進位資料';
DataSet.Open;

BlobStream := dsImage.CreateBlobStream(DataSet.FieldByName('資料流'),bmWrite);
FileStream := TFileStream.Create(OpenPictureDialog1.FileName,fmOpenRead or fmShareDenyNone);
BlobStream.CopyFrom(FileStream, FileStream.Size); // 會填入 [資料流'] 欄位

FileStream.Free;
BlobStream.Free;
DataSet.Post;

//讀檔上傳順便顯示,給 Image1 顯示圖形(用 TJpegImage 轉換)
TGraphicField(DataSet.FieldByName('資料流')).SaveToStream(Ms);
Ms.Position := 0; // 設為 0,否則會出錯
jpg.LoadFromStream(Ms);
Image1.Picture.Bitmap.Assign(jpg);
DataSet.Close;
Ms.Free;
Jpg.Free;
end;

二、下載,顯示
var ms : TMemoryStream;
jpg : TJpegImage;
begin
DataSet.Close;
DataSet.CommandText := 'select top 1 * from 二進位資料';
DataSet.Open;
if DataSet.RecordCount > 0 then
begin
Ms := TMemoryStream.Create;
TGraphicField(DataSet.FieldByName('資料流')).SaveToStream(Ms);
Ms.Position := 0; // 一定要設為 0,否則 jpg 產生錯誤
jpg := TJpegImage.Create;
jpg.LoadFromStream(Ms);
Image1.Picture.Bitmap.Assign(jpg);
jpg.Free;
Ms.Free;
end;
DataSet.Close;
end;
blueK
初階會員


發表:18
回覆:58
積分:35
註冊:2004-05-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-04-25 18:54:43 IP:112.104.xxx.xxx 未訂閱
dsImage.CreateBlobStream

dsImage 是一個資料集元件
evan690222
一般會員


發表:2
回覆:5
積分:1
註冊:2011-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-04-25 23:45:30 IP:61.64.xxx.xxx 訂閱
元件?
可是我怎麼沒有看到在那可以找得到呢?
煩請指教,謝謝。
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-04-26 09:58:39 IP:220.128.xxx.xxx 未訂閱
不好意思,我原本的程式碼的  TAdoDataSet 名稱是 dsImage,貼上來之前,我改為 DataSet 讓您一看就知道是 DataSet 元件,原來我有漏掉沒改到的,dsImage 就是 DataSet,我也改正了原檢的程式碼。
===================引 用 evan690222 文 章===================
元件?
可是我怎麼沒有看到在那可以找得到呢?
煩請指教,謝謝。
編輯記錄
cancer 重新編輯於 2011-04-25 20:01:29, 註解 無‧
evan690222
一般會員


發表:2
回覆:5
積分:1
註冊:2011-04-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-04-26 14:32:53 IP:114.33.xxx.xxx 訂閱
謝謝大大,
已測試成功。
接下來就是往下一階段前進了。
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-04-26 17:36:00 IP:220.128.xxx.xxx 未訂閱
謝謝大大結案給分。
===================引 用 evan690222 文 章===================
謝謝大大,
已測試成功。
接下來就是往下一階段前進了。
系統時間:2017-10-19 13:28:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!