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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

Delphi三層開發小技巧:TClientDataSet的Delta妙用

?

Delphi做三層開發時,很多人都會在客戶端放一個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.代碼如下:

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;

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

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

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

?? QuerySQL實現代碼如下:

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;

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

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('查詢數據出錯:'+err),'錯誤',MB_OK+MB_ICONERROR);?????

end;

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

?? cds.append;

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

?? //....

?? cds.post;

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

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

var err:string;

begin

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

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

?? ?begin

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

??????? cds.MergeChangeLog;//合并所有改變的數據

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

end;

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

scktsrvr.exe是一個NT的服務程序,你用scktsrvr.exe -install安裝之后,每次系統啟動,它都會自動運行的。如果你的客戶端用了socketconnection,每次連接應用服務器的時候,都需要通過scktsrvr.exe才能訪問到你的應用服務器.

scktsrvr.exe -uninstall 即可卸載

?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av不卡免费在线观看 | 综合网婷婷 | 第一福利av | 波多野结衣福利 | 亚洲国产精品视频在线观看 | 一区二区三区高清在线观看 | 国产资源在线看 | 狠狠躁18三区二区一区传媒剧情 | 国产伦精品一区二区三区视频黑人 | 婷婷在线免费观看 | 日本一区二区在线不卡 | 国精产品一区一区三区在线 | 中国毛片视频 | 国产精品视频成人 | 午夜精品久久久久久毛片 | 精品久久久久久亚洲精品 | 最新极品jizzhd欧美 | 日韩三级一区二区三区 | 日批免费观看视频 | 美女脱了裤子让男人捅 | 蜜桃成人在线视频 | 狠狠躁夜夜躁人 | 欧美色88 | 日韩福利视频一区 | 可以免费看av的网址 | 亚洲影视一区 | 日本高清黄色 | 夜晚福利视频 | 国产一区二区三区免费视频 | 亚洲第一页夜 | 国产人妻一区二区三区四区五区六 | 三级黄色片免费 | 国产精品天天av精麻传媒 | 日批视频在线播放 | 丝瓜av | 黄色片网站国产 | 国产好片无限资源 | 国产内射老熟女aaaa∵ | 欧美日韩性视频 | 国产黄色片视频 | 欧美成人免费一级 | 蜜桃视频污在线观看 | 丁香五香天堂 | 黄色理伦片 | 国产在线成人精品午夜 | 丰满孕妇性春猛交xx大陆 | 精品视频免费看 | 午夜免费观看视频 | 91刺激视频 | 337p粉嫩大胆噜噜噜亚瑟影院 | 成人在线激情视频 | 青青草操 | 蜜臀久久精品久久久久久酒店 | 一区二区三区丝袜 | 禁断介护av| 好看的中文字幕 | 欧美在线影院 | 狠狠操天天操夜夜操 | 人禽高h交 | 伊人av一区| 香蕉av在线 | av作品在线 | 亚洲色成人www永久在线观看 | 91免费看. | 午夜a区| 欧美日本二区 | 色葡萄影院 | av国产片 | 日本h片在线观看 | 欧美91看片特黄aaaa | 伊人啪啪| 亚洲熟妇一区 | av网在线播放 | 一级黄大片 | 亚洲色中色| 久久性av | 中文字幕一本 | 午夜免费在线观看 | 蓝牛av | 成人av亚洲 | 黄色三级视频网站 | 欧美 丝袜 自拍 制服 另类 | 国产肉体xxxx裸体784大胆 | 青青草国产成人99久久 | 在线观看成人免费 | 日本一级一片免费视频 | 午夜激情成人 | 五月天狠狠干 | 男女黄色又爽大片 | 日本熟妇人妻xxxxx | 少妇一级淫片aaaaaaa | 日韩av免费网址 | jjzz黄色片 | 亚洲国产欧美日韩在线 | 一区二区免费在线播放 | 超碰天天干| 国产精品无码电影在线观看 | 亚洲男人天堂影院 | jizz日本视频|