免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Delphi三層開發(fā)小技巧:TClientDataSet的Delta妙用
userphoto

2011.11.23

關注
Delphi做三層開發(fā)時,很多人都會在客戶端放一個TClientDataSet,中間層遠程數據模塊就對應放一個TDataSetProvider, 然后再連起來.其實這種方法很煩瑣,而且程序癰腫不甘,不好維護.我們都知道TClientDataSet的Delta屬性記錄了數據的所有修改,應用它我們就可以方便的實現一個單表更新的通用方法.

   首先,在中間層添加一個方法,就叫ApplyUpdates吧.方法定義如下:

   function ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;

參數UpdateTable是指要更新的表名,Delta是指傳過來的TClientDataSet的Delta屬性,如果更新錯誤err返回錯誤的內容.下面實現這個方法,首先在DataModule上放一個Query,Query連上Connection,然后再放一個 TDataSetProvider連Query.代碼如下:

01function TRoDm.ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;
02  
03const sql='select * from %s where 1<>1';
04  
05var sqlstr:string;
06  
07      ErrCount:Integer;
08  
09begin
10  
11    Result:=False;
12  
13   sqlstr:=Format(sql,[UpdateTable]);
14  
15   try
16  
17       Conn.BeginTrans;
18  
19       Query.Close;
20  
21       Query.sql.text:=sqlstr;
22  
23       Query.open;
24  
25      Provider.ApplyUpdates(Delta,-1,ErrCount);
26  
27      Result:=ErrCount=0;
28  
29      if Result then
30  
31         Conn.CommitTrans
32  
33      else Conn.RollbackTrans;
34  
35   except
36  
37       on E:Exception do
38  
39       begin
40  
41           Conn.RollbackTrans;
42  
43          err:=E.Message;
44  
45       end;
46  
47   end;
48  
49end;

    到此,通用的更新方法已經完成了.不過客戶端的ClientDataSet還不能查詢顯示數據,因此,還要寫一個查詢方法:

    function QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;

    參數sqlstr就是要持行的查詢語句,Data返回查詢結果,錯誤時err返回錯誤消息

   QuerySQL實現代碼如下:

01function TRoDm.QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;
02  
03begin
04  
05    Result:=False;
06  
07   try
08  
09      Query.close;
10  
11      Query.sql.text:=sqlstr;
12  
13        Query.sql.Open;
14  
15        Data:=Provider.Data;
16  
17       Result:=True;
18  
19    Except
20  
21         on E:Exception do
22  
23             err:=E.Message;
24  
25    end;
26  
27end;

    到這里,中間層的代碼已經完了,客戶端的調用就簡單了.比如客戶端有個數據模塊DM,上面放一個DcomConnection或者 SocketConnection,名叫Conn.例如,我們現在要做一個商品管理的功能,在窗體上放一個TClientDataSet叫Cds,放 DataSource,DBGrid等,設置好相應的屬性.然后在窗體創(chuàng)建(Create事件)時查詢回所有數據,代碼如下:

01const sql='select * from xxxx';
02  
03var Data:Variant;
04  
05      err:String;
06  
07begin
08  
09   if Dm.Conn.AppServer.QuerySQL(sql,Data,err) then
10  
11      Cds.Data:=Data
12  
13   else MessageBox(self.handle,pchar('查詢數據出錯:'+err),'錯誤',MB_OK+MB_ICONERROR);      
14  
15end;
16  
17   然后還有"添加","修改","刪除"按扭,代碼都和我們平時操作一樣,比如"添加"按扭的代碼:
18  
19   cds.append;
20  
21   cds.fieldbyname('xxx').asinteger:=xxx;
22  
23   //....
24  
25   cds.post;

    修改,刪除也這樣寫.不過現在還有個小問題是,這個表的主鍵的生成問題,這里我們不能用自增主鍵,要自己自己生成主鍵,這樣你還得在中間層寫一個中間層生成主鍵的方法,在"增加"按扭時生調用生成主鍵,然后再上面的操作.這里不再多說.

    增刪改完后,這時的數據還在客戶端的內存里,想保存到遠程的中間層服務器就要用到我們剛才的方法了,下面就是"保存"按扭下的代碼:

01var err:string;
02  
03begin
04  
05    if cds.ChangeCount=0 then exit;//數據沒改變就不用提交了
06  
07    if Dm.Conn.AppServer.ApplyUpdates('xxx',cds.Delta,err) then//xxx就是表名了
08  
09    begin
10  
11       MessageBox(self.handle,'保存成功!','提示',MB_OK+MB_ICONINFORMATION);
12  
13        cds.MergeChangeLog;//合并所有改變的數據
14  
15    end else MessageBox(self.handle,pchar('保存出錯:'+err),'錯誤',MB_OK+MB_ICONERROR);
16  
17end;

   到此,這篇文章也講完了.用這個方法,那些單表的基礎數據更新還可以寫成一個祖先類,只要加一個取得更新表名的虛方法,比如:function TableName:string;virtual;然后其后代只要override這個方法,返回各自的表名,其他的一句代碼都不用寫.

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
node連接mysql查詢事務處理的實現
我只用一個接口實現 CRUD,可能么?
Go 操作 MySQL 數據庫
Logging SQL queries in android
ClientDataset的使用
Go語言操作Mysql語言基礎知識
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服