線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1216
推到 Plurk!
推到 Facebook!

兩個資料表間的圖片型態之欄位要如何複製?

尚未結案
ez3cshop
一般會員


發表:13
回覆:6
積分:3
註冊:2005-01-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-24 21:37:58 IP:211.75.xxx.xxx 未訂閱
請教大家: 假設我在SQL Server有兩個資料表 A, B. 這兩個資料表的欄位結構都是一樣的, 但其中有一個屬於image的欄位PCT, 現在, 我必須把資料表A的資料複製到資料表B, 一些字串與數值的資料是沒有問題, 但碰到image型態的欄位就會有Bug, 例如: Query.Close; Query.SQL.Clear; Query.SQL.Add('INSERT INTO B '); Query.SQL.Add(' (ID, NAM, PCT, PRICE) '); Query.SQL.Add('VALUES '); Query.SQL.Add(' (:ID, :NAM, :PCT, :PRICE) '); Query.ParamByName('ID').Value = A.FieldByName('ID').Value; Query.ParamByName('NAM').Valie = A.FieldByName('NAM').Value; Query.ParamByName('PCT').Value = A.FieldByName('PCT').Value; //===>會出錯 Query.ParamByName('PRICE').Value = A.FieldByName('PRICE').Value; Query.ExecSQL; 我該怎麼做呢?
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-24 22:41:50 IP:218.32.xxx.xxx 未訂閱
ez3cshop 你好:    看了你的需求, 為何要將 A.PCT 取到前端, 再送回 B.PCT 呢 ?    直接     Insert Into A (ID, NAM, PCT, PRICE) select ID, NAM, PCT, PRICE from B where ... 這樣應比較好些    如果要從前端塞值進入 Image 欄位, 建議先送入其他欄位(尤其 Key 欄位), 然後單獨處理 Image (BLOB) 欄位, 必要(BLOB SIZE 很大)時, 還需用 Transaction 包裝整個資料交易.    另外, 建議你查查 "TBLOBField" 的相關說明文件.
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-24 23:22:35 IP:220.132.xxx.xxx 未訂閱
Hi, 請先參考 mickey 兄的建議(這樣不僅效能較佳, 而且也不需要將 binary 的資料送到 client來), 若仍不能滿足你的需求, 一定要將 binary 的資料帶出來後再寫回去, 這種欄位一般是用 TBlobField 來處理, 配合 TMemoryStream 來進行會比較理想, 請參考,    
var
  ms: TMemoryStream;
  size: integer;
...
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('INSERT INTO B ');
Query.SQL.Add(' (ID, NAM, PCT, PRICE) ');
Query.SQL.Add('VALUES ');
Query.SQL.Add(' (:ID, :NAM, :PCT, :PRICE) ');
Query.ParamByName('ID').Value = A.FieldByName('ID').Value;
Query.ParamByName('NAM').Valie = A.FieldByName('NAM').Value;
Query.ParamByName('PCT').Value = A.FieldByName('PCT').Value;      size := TBlobField(A.FieldByName('PCT')).BlobSize;
ms := TMemoryStream.Create;
ms.Size := size;
TBlobField(A.FieldByName('PCT')).SaveToStream(ms);
Query.ParamByName('PCT').SetBlobData(ms.Memory, ms.Size);    Query.ParamByName('PRICE').Value = A.FieldByName('PRICE').Value;
Query.ExecSQL;
ms.Free;
但仍提醒你, 除了效能上會較差外, 還得注意到你使用 BDE 這組資料存取時, 對於 Blob 資料的預設大小為 32k, 若你該欄位資料會大於 32k時, 請在 TDatabase 元件上的 BLOB SIZE 設為更大, 如 1024 就有 1mb 囉, 請你特別注意!!
ez3cshop
一般會員


發表:13
回覆:6
積分:3
註冊:2005-01-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-27 23:01:22 IP:59.120.xxx.xxx 未訂閱
引言: ez3cshop 你好: 看了你的需求, 為何要將 A.PCT 取到前端, 再送回 B.PCT 呢 ? 直接 Insert Into A (ID, NAM, PCT, PRICE) select ID, NAM, PCT, PRICE from B where ... 這樣應比較好些 如果要從前端塞值進入 Image 欄位, 建議先送入其他欄位(尤其 Key 欄位), 然後單獨處理 Image (BLOB) 欄位, 必要(BLOB SIZE 很大)時, 還需用 Transaction 包裝整個資料交易. 另外, 建議你查查 "TBLOBField" 的相關說明文件. < face="Verdana, Arial, Helvetica"> 因為A,B位於不同的伺服器上的兩個資料庫, 必須利用程式去自行設計客製化的資料同步作業...
系統時間:2024-04-19 17:37:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!