請問相片如何透過Timage元件存取SQLserver? |
答題得分者是:cancer
|
evan690222
一般會員 發表:2 回覆:5 積分:1 註冊:2011-04-22 發送簡訊給我 |
|
boss.tw
高階會員 發表:15 回覆:109 積分:194 註冊:2005-05-17 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
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; |
evan690222
一般會員 發表:2 回覆:5 積分:1 註冊:2011-04-22 發送簡訊給我 |
抱歉,第一次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
初階會員 發表:19 回覆:62 積分:36 註冊:2004-05-06 發送簡訊給我 |
|
evan690222
一般會員 發表:2 回覆:5 積分:1 註冊:2011-04-22 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
不好意思,我原本的程式碼的 TAdoDataSet 名稱是 dsImage,貼上來之前,我改為 DataSet 讓您一看就知道是 DataSet 元件,原來我有漏掉沒改到的,dsImage 就是 DataSet,我也改正了原檢的程式碼。
===================引 用 evan690222 文 章=================== 元件? 可是我怎麼沒有看到在那可以找得到呢? 煩請指教,謝謝。
編輯記錄
cancer 重新編輯於 2011-04-25 20:01:29, 註解 無‧
|
evan690222
一般會員 發表:2 回覆:5 積分:1 註冊:2011-04-22 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |