midas结构,在服务器端,怎样截获并修改provider自动生成的SQL语句?(200分)

D

donkey

Unregistered / Unconfirmed
GUEST, unregistred user!
我想通过截获并修改provider自动生成的SQL语句(关键是Where部分)来控制数据的更新,
请问如何实现?
 
beforeapplyupdate事件中。
 
这个比较难。Provider会创建一个SqlResolver来生成SQL并执行数据更新。但可惜的是没有
相关的事件可以改变SQL语句。
当然还是有办法,只是要麻烦一点:
从SqlResolver继承一个新类如TMySqlResolver,然后可以重载DoExecSQL方法以截获并修改
provider自动生成的SQL语句;
从TDatasetProvider继承一个新类TMyDatasetProvider,然后可以重载CreateResolver方法
以创建新的TMySqlResolver;
最后在远程数据模块上创建新的TMyDatasetProvider代替原有的TDatasetProvider并设置相
关的ProviderName和DATASET。
干脆把代码写出来吧:
TMySQLResolver = class(TSQLResolver)
protected
proceduredo
ExecSQL(SQL: TStringList;
Params: TParams);
override;
end;

TMyDataSetProvider=class(TDataSetProvider)
protected
function CreateResolver: TCustomResolver;
override;
end;

implementation
{ TMyDataSetProvider }
function TMyDataSetProvider.CreateResolver: TCustomResolver;
begin
if ResolveToDataSet then
Result := TDataSetResolver.Create(Self)
else
Result := TMySQLResolver.Create(Self);
end;

{ TMySQLResolver }
procedure TMySQLResolver.DoExecSQL(SQL: TStringList;
Params: TParams);
begin
//这里可以修改SQL了,至于怎么改不用说了吧
//SQL.Text := 'update ....'
inherited;
end;
 
终于有个高手现身了,回去试试。
对了,高手,顺便问一句,对于公文包模式的数据同步问题,可以指教一二吗?
 
顶部