一个ClientDataSet问题!!!(虽然分不多但请各位能多帮帮忙,谢谢) ( 积分: 11 )

  • 主题发起人 主题发起人 新来的菜鸟
  • 开始时间 开始时间

新来的菜鸟

Unregistered / Unconfirmed
GUEST, unregistred user!
DataSetProvider里有个BeforeUpdateRecord事件是可以抓到变动的字段自动生成sql的<br>我写的事件如下<br>procedure&nbsp;TfrmDLLForm.DataSetProvider1BeforeUpdateRecord(Sender:&nbsp;TObject;<br>&nbsp;&nbsp;SourceDS:&nbsp;TDataSet;&nbsp;DeltaDS:&nbsp;TCustomClientDataSet;<br>&nbsp;&nbsp;UpdateKind:&nbsp;TUpdateKind;&nbsp;var&nbsp;Applied:&nbsp;Boolean);<br><br>var<br>i:integer;<br>updstr,insfstr,insvstr,whrstr:widestring;<br>sqlstr:string;<br>begin<br><br><br>if&nbsp;updatekind=ukModify&nbsp;then<br>begin<br><br><br>//////////////////////////////////////////修改<br><br>&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;Deltads.FieldCount-1&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(deltads.Fields.FieldKind=Fkdata)&nbsp;and&nbsp;&nbsp;(pfInWhere&nbsp;in&nbsp;deltads.Fields.ProviderFlags)&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;vartype(deltads.Fields.OldValue)&nbsp;in&nbsp;[varDouble,varCurrency,varInteger,varSmallint,varSingle]&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whrstr:=whrstr+deltads.Fields.FieldName+'='+floattostr(deltads.Fields.oldValue)+'&nbsp;and&nbsp;'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;vartype(deltads.Fields.OldValue)&nbsp;in&nbsp;[varboolean]&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whrstr:=whrstr+deltads.Fields.FieldName+'='+booltostr(deltads.Fields.oldValue)+'&nbsp;and&nbsp;'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;vartype(deltads.Fields.newValue)=vardate&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whrstr:=whrstr+deltads.Fields.FieldName+'='''+datetimetostr(deltads.Fields.oldValue)+''''+'&nbsp;and&nbsp;'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whrstr:=whrstr+deltads.Fields.FieldName+'='''+vartostr(deltads.Fields.oldValue)+''''+'&nbsp;and&nbsp;';<br><br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;whrstr:=leftstr(whrstr,length(whrstr)-5);<br>&nbsp;&nbsp;sqlstr:='update&nbsp;Tygeneralize_basic&nbsp;set&nbsp;'+updstr+'&nbsp;where&nbsp;id='+trim(cbmdsetid.Text);<br><br><br>//////////////////////////////////////////修改<br><br>end<br>else&nbsp;if&nbsp;updatekind=ukDelete&nbsp;then<br>begin<br>&nbsp;&nbsp;sqlstr:='Delete&nbsp;test&nbsp;&nbsp;where&nbsp;&nbsp;id='+trim(cbmdsetid.Text);<br>end&nbsp;else<br>begin<br><br><br>&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;Deltads.FieldCount-1&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(deltads.Fields.FieldKind=Fkdata)&nbsp;and&nbsp;&nbsp;(pfInUpdate&nbsp;in&nbsp;deltads.Fields.ProviderFlags)&nbsp;and&nbsp;(not&nbsp;varisempty(deltads.Fields.newValue))&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insfstr:=insfstr+deltads.Fields.FieldName+',';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;vartype(deltads.Fields.Value)&nbsp;in&nbsp;[varDouble,varCurrency,varInteger,varSmallint,varSingle]&nbsp;then&nbsp;//&nbsp;in&nbsp;[ftSmallint,&nbsp;ftInteger,ftBoolean,ftBCD,ftBytes,&nbsp;ftVarBytes,&nbsp;ftAutoInc,&nbsp;ftBlob]&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insvstr:=insvstr+floattostr(deltads.Fields.Value)+','<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;vartype(deltads.Fields.Value)&nbsp;in&nbsp;[varboolean]&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insvstr:=insvstr+booltostr(deltads.Fields.Value)+','<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;vartype(deltads.Fields.Value)=vardate&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insvstr:=insvstr+''''+datetimetostr(deltads.Fields.Value)+''''+','<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insvstr:=insvstr+''''+vartostr(deltads.Fields.Value)+''''+','<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;insfstr:=leftstr(insfstr,length(insfstr)-1);<br>&nbsp;&nbsp;insvstr:=leftstr(insvstr,length(insvstr)-1);<br>&nbsp;&nbsp;sqlstr:='Insert&nbsp;into&nbsp;test&nbsp;('+insfstr+')&nbsp;values('+insvstr+')';<br>end;<br>end;<br><br>这是抓出变动的字段自动生成sql的,但现在我把架构改成三层的了,把DataSetProvider放到了中间层,客户端只有一个ClientDataSet,现在我想在ClientDataSet里实现上面那样的功能,如何实现!请高手们指教,谢谢(能不能借助第三方控件呢)!
 
两层的好像没有太多办法<br>www.chinadacs.cn<br>www.chinadacs.com.cn
 
为什么一定要在客户端做这个动作,而不在中间层去做呢?<br>有什么特别的原因吗?
 
to&nbsp;king.gray<br>我觉得放在客户端做要灵活一些,而且以后维护
 
各位大哥你们是如何生成SQL的不会上把sql写死吧,如果你们有更好的方法能不能告诉小弟呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
937
SUNSTONE的Delphi笔记
S
后退
顶部