日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi三层开发小技巧:TClientDataSet的Delta妙用

發(fā)布時(shí)間:2025/3/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi三层开发小技巧:TClientDataSet的Delta妙用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

?

Delphi做三層開發(fā)時(shí),很多人都會(huì)在客戶端放一個(gè)TClientDataSet,中間層遠(yuǎn)程數(shù)據(jù)模塊就對應(yīng)放一個(gè)TDataSetProvider,然后再連起來.其實(shí)這種方法很煩瑣,而且程序很繁瑣,不好維護(hù).我們都知道TClientDataSet的Delta屬性記錄了數(shù)據(jù)的所有修改,應(yīng)用它我們就可以方便的實(shí)現(xiàn)一個(gè)單表更新的通用方法.

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

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

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

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

const sql='select * from %s where 1<>1';

var sqlstr:string;

????? ErrCount:Integer;

begin

??? Result:=False;

?? sqlstr:=Format(sql,[UpdateTable]);

?? try

?????? Conn.BeginTrans;

??? ???Query.Close;

?????? Query.sql.text:=sqlstr;

?????? Query.open;

????? Provider.ApplyUpdates(Delta,-1,ErrCount);

????? Result:=ErrCount=0;

????? if Result then

???????? Conn.CommitTrans

????? else Conn.RollbackTrans;

?? except

?????? on E:Exception do

?? ????begin

?????????? Conn.RollbackTrans;

????????? err:=E.Message;

?????? end;

?? end;

end;

??? 到此,通用的更新方法已經(jīng)完成了.不過客戶端的ClientDataSet還不能查詢顯示數(shù)據(jù),因此,還要寫一個(gè)查詢方法:

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

??? 參數(shù)sqlstr就是要持行的查詢語句,Data返回查詢結(jié)果,錯(cuò)誤時(shí)err返回錯(cuò)誤消息

?? QuerySQL實(shí)現(xiàn)代碼如下:

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

begin

??? Result:=False;

?? try

????? Query.close;

????? Query.sql.text:=sqlstr;

??????? Query.sql.Open;

??????? Data:=Provider.Data;

?????? Result:=True;

??? Except

???????? on E:Exception do

???????????? err:=E.Message;

??? end;

end;

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

const sql='select * from xxxx';

var Data:Variant;

????? err:String;

begin

?? if Dm.Conn.AppServer.QuerySQL(sql,Data,err) then

????? Cds.Data:=Data

?? else MessageBox(self.handle,pchar('查詢數(shù)據(jù)出錯(cuò):'+err),'錯(cuò)誤',MB_OK+MB_ICONERROR);?????

end;

?? 然后還有"添加","修改","刪除"按扭,代碼都和我們平時(shí)操作一樣,比如"添加"按扭的代碼:

?? cds.append;

?? cds.fieldbyname('xxx').asinteger:=xxx;

?? //....

?? cds.post;

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

??? 增刪改完后,這時(shí)的數(shù)據(jù)還在客戶端的內(nèi)存里,想保存到遠(yuǎn)程的中間層服務(wù)器就要用到我們剛才的方法了,下面就是"保存"按扭下的代碼:

var err:string;

begin

??? if cds.ChangeCount=0 then exit;//數(shù)據(jù)沒改變就不用提交了

??? if Dm.Conn.AppServer.ApplyUpdates('xxx',cds.Delta,err) then//xxx就是表名了

?? ?begin

?????? MessageBox(self.handle,'保存成功!','提示',MB_OK+MB_ICONINFORMATION);

??????? cds.MergeChangeLog;//合并所有改變的數(shù)據(jù)

??? end else MessageBox(self.handle,pchar('保存出錯(cuò):'+err),'錯(cuò)誤',MB_OK+MB_ICONERROR);

end;

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

scktsrvr.exe是一個(gè)NT的服務(wù)程序,你用scktsrvr.exe -install安裝之后,每次系統(tǒng)啟動(dòng),它都會(huì)自動(dòng)運(yùn)行的。如果你的客戶端用了socketconnection,每次連接應(yīng)用服務(wù)器的時(shí)候,都需要通過scktsrvr.exe才能訪問到你的應(yīng)用服務(wù)器.

scktsrvr.exe -uninstall 即可卸載

?

總結(jié)

以上是生活随笔為你收集整理的Delphi三层开发小技巧:TClientDataSet的Delta妙用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。