我们知道,通过Schema,一个DataAbstracService对应一个数据库;一个服务器可以包含多个DataAbstracService,从而实现对多个数据库的操作。通过事件处理我们可以在一个DataAbstracService中去调用另一个DataAbstracService,从而实现同时操作多个数据库。目前在版本7.0.65中通过在Schema中写脚本还不能做到这一点。本人少量的改写了DataAbstract后,做到了这一点。下面是要修改的两个类定义:
1、修改uDAEcmaScriptWrappers单元文件中的TDAEcmaLDAWrapper类,添加两个方法:
function newLDA(serviceName: string): TDAEcmaLDAWrapper;
function executeCommand(commandName: string; parameters: variant): Integer;
改写下面的方法:
function ExecuteMethod(aMethodName: string; aParams: Variant): Variant; override;
procedure IntCreate;
具体实现:
function TDAEcmaLDAWrapper.newLDA(serviceName: string): TDAEcmaLDAWrapper;
var
Adapter: TDALocalDataAdapter;
begin
Adapter := TDALocalDataAdapter.Create(serviceName);
Adapter.SessionID := fLDA.SessionID;
Result := TDAEcmaLDAWrapperClass(ClassType).Create(Adapter);
end;
function TDAEcmaLDAWrapper.executeCommand(commandName: string; parameters: variant): Integer;
var
lParams, lOutParams: DataParameterArray;
begin
lParams := VariantToDataParameterArray(parameters);
Result := fLDA.ServiceInstance.ExecuteCommandEx(commandName, lParams, lOutParams);
lOutParams.Free;
end;
function TDAEcmaLDAWrapper.ExecuteMethod(aMethodName: string; aParams: Variant): Variant;
begin
......
// ============================================添加的代码
else
if aMethodName =
'newLDA' then begin
CheckParams(aMethodName,aParams,
);
Result := newLDA(aParams[
]).AsVariant;
end
else
if aMethodName =
'executeCommand' then begin
CheckParams(aMethodName,aParams,
);
Result := executeCommand(aParams[
], aParams[
]);
end
//==============================================
else begin
Result := inherited ExecuteMethod(aMethodName,aParams);
end;
end;
procedure TDAEcmaLDAWrapper.IntCreate;
begin
RegisterMethod(
'insert');
RegisterMethod(
'update');
RegisterMethod(
'remove');
RegisterMethod(
'discardChanges');
RegisterMethod(
'applyChanges');
RegisterMethod(
'selectSQL');
RegisterMethod(
'selectWhere');
//====================================添加的代码
RegisterMethod(
'newLDA');
RegisterMethod(
'executeCommand');
//====================================
fDeltas:= TList.Create;
fDeltaList := TDAEcmaSchemaNamedListWrapper.Create(fDeltas, IntWrap, IntFind);
fSelectResultList:= TObjectList.Create(True);
end;
、修改uDAScriptContext单元文件中的TDAScriptContext类
function TDAScriptContext.CreateLDA: TDALocalDataAdapter;
begin
Result := TDALocalDataAdapter.Create(nil);
Result.ServiceInstance := fOwner;
Result.DynamicSelect := True;
//====================================添加的代码
Result.SessionID := fOwner.ClientID;
//====================================
end;
OK,修改完成。
下面来看一个实例:
, }) == )
fail("级联删除失败");
log(" 级联删除产品信息成功");
}
}
使用上面的方法,有点像写触发器,但可以同时操作多个数据库,而且可以是不同类型的数据库。此方法可以用来做数据集成平台。
上面的代码已通过测试,欢迎大家指正!