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

自製懶人版的DbxDAC

 
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-04-17 18:04:23 IP:59.120.xxx.xxx 未訂閱
http://grandruru.blogspot.tw/2013/04/dbxdac.html

提供在下的一些想法,不知這樣的作法實用度如何?
sryang
尊榮會員


發表:38
回覆:740
積分:875
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-04-18 15:00:37 IP:114.35.xxx.xxx 訂閱
如何與資料感知機制結合?
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-04-18 15:49:53 IP:59.120.xxx.xxx 未訂閱
把DbxDataSet產出後,純粹對ClientDataSet做對應就可以了

完全把它視為一個TADOQuery / TQuery

===================引 用 sryang 文 章===================
如何與資料感知機制結合?
sryang
尊榮會員


發表:38
回覆:740
積分:875
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-04-18 15:54:31 IP:114.35.xxx.xxx 訂閱
 Design Time 能和 DataSource 對應到嗎?不能吧

要搞 VCL component 就要考慮 design time 跟 run time

做戲要做全套囉~~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-04-18 16:04:02 IP:59.120.xxx.xxx 未訂閱
可以的

在這個Demo中有實際在Design mode下連結過MySQL

所以DataSource.DataSet會是:DbxDataSet1.cds

DbxDataSet的圖片大小是SimpleDataSet的四倍大(笑)
雖然不像是SimpleDataSet這麼迷你,不過比起那個有時侯會異常的「SimpleDataSet.InternalDataSet」

還不如像DbxDataSet1.ClientDataSet會比較直覺

===================引 用 sryang 文 章===================
Design Time 能和 DataSource 對應到嗎?不能吧

要搞 VCL component 就要考慮 design time 跟 run time

做戲要做全套囉~~
sryang
尊榮會員


發表:38
回覆:740
積分:875
註冊:2002-06-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-04-18 16:23:36 IP:114.35.xxx.xxx 訂閱
個人覺得不可見元件的基類還是使用 TComponent 比較好,你這樣寫是無法放進 TDataModule 裡面的

既然要做的是 DataSet,當然直接繼承自 TClientdataSet 是最好的
裡面再包含 TDataSetProvider 與 TSQLQuery,這兩個是 private 成員
這樣用起來更直覺

另外,還有幾個問題:
  1. 如何把 ProviderFlags 順利的指到 TSQLQuery 裡面的 TField?
  2. 如何避免使用者調整你不想被調整的裡面包含的元件的屬性?(例如 dsp.Options 裡面的 poAllowCommandText)
  3. 更新時出現 Exception 的處理,你目前這樣寫,更新時出現 Exception 是不會有任何錯誤訊息的
  4. Join Table 的處理

------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2013-04-18 16:24:12, 註解 無‧
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-04-18 17:31:38 IP:59.120.xxx.xxx 未訂閱
要放TDataModule就認命拉三大元件吧,要不就復刻的SQLClientDataSet會好一些
而那個SimpleDataSet是真的非常非常非常不好用
題外話:SQLClientDataSet真的比較安定,只是2009開始就轉不上去了

考慮在下的功力
以BUG產出量的前提下,包在TFrame裡會比較安全

可以把TSQLQuery和TDataSetProvider放在TFrame的Private區塊中
然後再實作出代理人的機制會更佳的完美

考量了第一 二項問題,
可以
不隱藏TSQLQuery
隱藏TDataSetProvider然後實作出DataSetProvider部份的Property和Event

第三項問題在2-Tier中可以在ClientDataSetReconcileError直上

第四項問題我可能會傾向實作DataSetProvider的DataSetProviderBeforeUpdateRecord來硬上吧
因為我不知道ADO的Join Table要怎麼做……

所以參考這樣的程式,我想應該可以解決Join Table的問題

[code delphi]
/// 資料來源:TDataSetProvode提交數據
procedure Tfrm_docD360YH.dsp_DTBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind; var Applied: Boolean);
var
I: Integer;
Modifyed: Boolean;
begin
Inherited;

//增加更新狀態 由於下面 Applied := Not Modifyed會將下一筆更新語句狀態清空,
//所以必須先將所有字段打上更新標記
for I := 0 To DeltaDS.Fields.Count - 1 do
DeltaDS.Fields[i].ProviderFlags := DeltaDS.Fields[i].ProviderFlags [pfInUpdate];

{增加鍵值}
DeltaDS.FieldByName('D12101').ProviderFlags :=
DeltaDS.FieldByName('D12101').ProviderFlags [pfInKey] - [pfInUpdate];

//去掉計算字段更新標誌
DeltaDS.FieldByName('B03002').ProviderFlags :=
DeltaDS.FieldByName('B03002').ProviderFlags - [pfInUpdate];
DeltaDS.FieldByName('B03004').ProviderFlags :=
DeltaDS.FieldByName('B03004').ProviderFlags - [pfInUpdate];

if UpdateKind = ukModify then
begin
Modifyed := False;
//去掉未修改字段更新標誌
for I := 0 To DeltaDS.Fields.Count - 1 do
begin
if Not (pfInKey In DeltaDS.Fields[i].ProviderFlags) and
(DeltaDS.Fields[i].Value = null) and (DeltaDS.Fields[i].OldValue <> null) then
DeltaDS.Fields[i].ProviderFlags := DeltaDS.Fields[i].ProviderFlags - [pfInUpdate];
end;
for I := 0 To DeltaDS.Fields.Count - 1 do
begin
if pfInUpdate In DeltaDS.Fields[i].ProviderFlags then
begin
Modifyed := True;
Break;
end;
end;
Applied := Not Modifyed;
end;
end;
[/code]


可是這樣又不能把DataSetProvider藏起來了,矛盾! 哈!

===================引 用 sryang 文 章===================
個人覺得不可見元件的基類還是使用 TComponent 比較好,你這樣寫是無法放進 TDataModule 裡面的

既然要做的是 DataSet,當然直接繼承自 TClientdataSet 是最好的
裡面再包含 TDataSetProvider 與 TSQLQuery,這兩個是 private 成員
這樣用起來更直覺

另外,還有幾個問題:
  1. 如何把 ProviderFlags 順利的指到 TSQLQuery 裡面的 TField?
  2. 如何避免使用者調整你不想被調整的裡面包含的元件的屬性?(例如 dsp.Options 裡面的 poAllowCommandText)
  3. 更新時出現 Exception 的處理,你目前這樣寫,更新時出現 Exception 是不會有任何錯誤訊息的
  4. Join Table 的處理

編輯記錄
GrandRURU 重新編輯於 2013-04-18 17:35:49, 註解 無‧
系統時間:2017-10-17 13:43:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!