这个比较难。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;