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

Binary(16)欄位編輯問題

答題得分者是:P.D.
weston
一般會員


發表:8
回覆:7
積分:3
註冊:2007-02-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-21 10:11:49 IP:211.21.xxx.xxx 訂閱
  請問有經驗的大大?小弟在資料庫有各欄位型態是 Binary(16)長度為16,其實他是用來儲存 GUID唯一值,由於編輯的關係,會Open關聯很多Table做欄位編輯
例如,假設Tabl1 是基本資料,Tabel2是模型資料,Table3是製造商資料:
Adoquery1.active:=false;
Adoquery1.SQL.clear;
SQLstr:='select * from Table1 A1 ,Table2 A2 ,Tabl3 A3 where (A1.model_Guid=A2.Guid) and (A2.manufacturer_Grid=A3.Guid)
Adoquery1.SQL.add(SQLstr);
Adoquery1.Active:=true;
可是問題如果修改 Table1某各欄位是model_Guid,有辦法能夠直接修改嗎?
類似
Adoquery1.Edit;
Adoquery1.fieldByName('model_Guid').Vaule=HexToRaw('12700e96b3e2474e9b4d05add2679719');
//舉例上面這行是不通的,HexToRaw是Oralce函數,會顯示錯誤訊息model_Guid can't be modify
Adoquery1.Post;
我知道可以用ExecSQL直接update,但這樣做若要更新基本資料中欄位[ 模型變更和模型描述和模型製造商電話]
就得分兩次做,
第一次更新基本資料表格,模型變更
SQLstr:='update table 1 set mode_Guid='0x12700e96b3e2474e9b4d05add2679719' where Guid='0x11111111111111111111111111111';
第二次更新模型資料表格,模型描述變更
SQLstr:='update table 2 set mode_desc='模型描述' where Guid='0x12700e96b3e2474e9b4d05add2679719';
第三次更新執造商資料表格,模型製造商電話變更,先找出此模組製造商Guid=0x22222222222222222222222222 在進行更新
SQLStr:='select manufacturer_Grid from table2 where Guid='0x12700e96b3e2474e9b4d05add2679719';
SQLstr:='update table 3 set manufacturer_phon='0224921212' where Guid='0x22222222222222222222222222';

,希望有大大看懂我的意思,能否直接有辦法直接Edit Guid,變成以下簡化複雜,因為關聯表格不會只有單純3、5各,修改欄位都30、40以上都分散各關聯table......

Adoquery1.Edit;
Adoquery1.fieldByName('model_Guid').Vaule=HexToRaw('12700e96b3e2474e9b4d05add2679719');
Adoquery1.fieldByName('model_Desc').Assstring='模型描述'
Adoquery1.fieldByName('manufacturer_phon').Assstring='0224921212'
Adoquery1.Post;

謝謝大大!...有比較好作法敬請指導.....謝謝感恩!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-21 11:34:14 IP:61.67.xxx.xxx 未訂閱
花了我好大的力氣才看完這篇, 發現有好幾矛盾, 這裡我不探討Binary在Oralce中如何儲存, 就設計上的經驗值來討論
1.當然, 我並不知道這麼重要的一個欄位model_guid 為什麼會使用如此特殊的結構來定義, 若之後要轉換資料庫或其他用途時, 未必所有資料庫系統都有支援, 個人意見盡量遵循ansi-92的架構來設置是比較明智之舉
2.如果你的關聯檔那麼多, 不管是用update, 還是利用select 動作再進行edit, 其實也都是要寫很多的sql語法, 然後一個一個edit修改這與下update 沒有太大的差別, 而且這麼多關聯, 我的做法是為按你以下的做法, 一個一個去update , 一方面可以比較容易掌屋update的確實性, 另外如果update 上有一個關聯檔有狀況, 也比較容易查與維護, 我常告訴我的徒弟, 你是要寫一支高度結構化的程式, 還是要寫一支容易閱讀, 容易交接, 容易維護的程式, 那一種比較好?
3.對於你底下提到更新描述電話那段, 其實存在很大的問題
SQLstr:='update table 1 set mode_Guid='0x12700e96b3e2474e9b4d05add2679719' where Guid='0x11111111111111111111111111111';
這是table1更新主key mode_guid , 這段沒有問題

SQLstr:='update table 2 set mode_desc='模型描述' where Guid='0x12700e96b3e2474e9b4d05add2679719';
這段有沒有發現有很大問題
table1 與 table2 的關聯靠的是什麼, table1.mode_guid 與 table2.guid,
如果就純以update方式來看, 你更新了 table2.mode_desc, 你在table2引用新的guid判斷卻會造成沒有實質更新, 或許你的table2在前面有先進行edit new guid 的功能吧, 但我覺得整個更新流程很亂
如果完全用update方式進行時, 應該是針對主key(guid)有一組
update tableXXX set guid= :new_guid where guid= :old_guid
更新非主key的內容
update tableXXX set otherfield= :new_data where guid= :now_guid
針對每一個關聯檔(tableXXX)進行異動, 其實我認為這樣才是比較好識別的做法
4.一般關性的檔案, 如果有更新到主key時, 經驗法則告訴我們, 要從關聯的最底層更新上來
所以應該是 table3 -> table2 -> 最後才是主檔 table1 進行異動 guid值
而你的做法是 table1 -> table2 -> table3 , 這樣是屬於高危險群的, 應一旦主檔key變了, 底下所有的關聯全部會失效, 我不知道這當中你對關聯還有做什麼事, 所以變的是無法掌握的
5.設計那麼多的關聯檔, 或許是考慮資料庫正規化的設計, 但關聯越多, 代表其連繫性也複雜, 所以應以小心為上, 而不是方便為首要, 所以我寧可多寫一些code, 走安全, 穩定的做法, 貪快未必好!

以上僅提供個人意見供參考~~~
===================引 用 weston 文 章===================
請問有經驗的大大?小弟在資料庫有各欄位型態是 Binary(16)長度為16,其實他是用來儲存 GUID唯一值,由於編輯的關係,會Open關聯很多Table做欄位編輯
例如,假設Tabl1 是基本資料,Tabel2是模型資料,Table3是製造商資料:
Adoquery1.active:=false;
Adoquery1.SQL.clear;
SQLstr:='select * from Table1 A1 ,Table2 A2 ,Tabl3 A3 where (A1.model_Guid=A2.Guid) and (A2.manufacturer_Grid=A3.Guid)
Adoquery1.SQL.add(SQLstr);
Adoquery1.Active:=true;
可是問題如果修改 Table1某各欄位是model_Guid,有辦法能夠直接修改嗎?
類似
Adoquery1.Edit;
Adoquery1.fieldByName('model_Guid').Vaule=HexToRaw('12700e96b3e2474e9b4d05add2679719');
//舉例上面這行是不通的,HexToRaw是Oralce函數,會顯示錯誤訊息model_Guid can't be modify
Adoquery1.Post;
我知道可以用ExecSQL直接update,但這樣做若要更新基本資料中欄位[ 模型變更和模型描述和模型製造商電話]
就得分兩次做,
第一次更新基本資料表格,模型變更
SQLstr:='update table 1 set mode_Guid='0x12700e96b3e2474e9b4d05add2679719' where Guid='0x11111111111111111111111111111';
第二次更新模型資料表格,模型描述變更
SQLstr:='update table 2 set mode_desc='模型描述' where Guid='0x12700e96b3e2474e9b4d05add2679719';
第三次更新執造商資料表格,模型製造商電話變更,先找出此模組製造商Guid=0x22222222222222222222222222 在進行更新
SQLStr:='select manufacturer_Grid from table2 where Guid='0x12700e96b3e2474e9b4d05add2679719';
SQLstr:='update table 3 set manufacturer_phon='0224921212' where Guid='0x22222222222222222222222222';

,希望有大大看懂我的意思,能否直接有辦法直接Edit Guid,變成以下簡化複雜,因為關聯表格不會只有單純3、5各,修改欄位都30、40以上都分散各關聯table......

Adoquery1.Edit;
Adoquery1.fieldByName('model_Guid').Vaule=HexToRaw('12700e96b3e2474e9b4d05add2679719');
Adoquery1.fieldByName('model_Desc').Assstring='模型描述'
Adoquery1.fieldByName('manufacturer_phon').Assstring='0224921212'
Adoquery1.Post;

謝謝大大!...有比較好作法敬請指導.....謝謝感恩!
weston
一般會員


發表:8
回覆:7
積分:3
註冊:2007-02-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-05-21 13:05:20 IP:211.21.xxx.xxx 訂閱
感謝版主的回覆! 第一篇苗述 Table1,Table2,Tabl3都是獨立的表格
Table1=基本資料,主Key= uuid
Table2=模型資料,主Key= uuid
Table3=製造商資料,主Key= uuid
Table1透過 model_uuid 關離 Table2 可以得知基本資料model資訊
Tabel2透過 manfacture_uuid關聯 Tabl3可以得知模型製造商的資訊
,所以當關聯這三各表格一次撈出來的資料:
1.如果要變更基本資料模型 等同變更Table1透過 model_uuid欄位
2 如果要變更基本資料A模型,此A模型製造商,
等同變更Table2透過 manfacture_uuid 欄位 where model_uuid=A模型.uuid
如此更新動作才算做完一筆資料,如果使用者批次修改30筆,
想說這樣就必須 ExecSQL=30*2=60次執行
所以才思考是否直接 Edit 然後 Post 這樣就OK了,因為修改只會修改到參考關聯Key
,抱歉第一篇舉的例子不好,其實不會異動到Table3的資料。
其實我主要關鍵的疑問是,Binary欄位的Edit,
如果UUID欄位型態為整數或其他就不會有這樣問題了,只是我不知道如果儲存Binary(16)欄位
如果可以解決的話就方便多了,因為我看同樣BlobField欄位在Active之後可以儲存
ADoquery1.Active:=true;
TBlobField(ADoquery1.FieldByName('RTFile')).SaveToFile('2.rtf');
ADoquery1.Active:=false;
所以同樣類似binary欄位應該也可以才對
Adoquery1.Edit;
Adoquery1.fieldByName('model_Guid').Vaule=HexToRaw('12700e96b3e2474e9b4d05add2679719');
Adoquery1.Post;
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-05-21 18:27:30 IP:61.67.xxx.xxx 未訂閱
其實你的第二篇比第一篇更"花", 但我大概看出一個重點, 重點應該不在於用edit 或 update, 而是binary 存不進去的問題吧!
關於這點, 幫不忙, 沒用過這類欄位,
但我在存blob欄位時, 使用這樣的方式存檔, 你參考看看是否有類似的做法
TBLOBField(ADOQuery_image.FieldByName('IMAGE_DATA')).LoadFromFile(jpgfile);
系統時間:2024-05-07 0:16:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!