Binary(16)欄位編輯問題 |
答題得分者是:P.D.
|
weston
一般會員 發表:8 回覆:7 積分:3 註冊:2007-02-07 發送簡訊給我 |
請問有經驗的大大?小弟在資料庫有各欄位型態是 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 發送簡訊給我 |
花了我好大的力氣才看完這篇, 發現有好幾矛盾, 這裡我不探討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 發送簡訊給我 |
感謝版主的回覆! 第一篇苗述 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |