我们知道,通过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(" 级联删除产品信息成功");
    }
}

使用上面的方法,有点像写触发器,但可以同时操作多个数据库,而且可以是不同类型的数据库。此方法可以用来做数据集成平台。

上面的代码已通过测试,欢迎大家指正!

增强Delphi.RemObject.DataAbstract的脚本功能:多数据库同时操作的更多相关文章

  1. Delphi中使用python脚本读取Excel数据

    Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  2. Delphi 各版本新特性功能网址收集

    Delphi XE2 三个新功能介绍举例_西西软件资讯  http://www.cr173.com/html/13179_1.html delphi 2007新功能简介-davidxueer-Chin ...

  3. O365 "打开或关闭脚本"功能

    博客地址:http://blog.csdn.net/FoxDave 自定义功能是 SharePoint Online 最具吸引力的功能之一,因为它使管理员和用户可以调整网站和页面的外观以满足组织目 ...

  4. Delphi XE2有什么新功能

    具体内容见PDF Delphi XE2有什么新功能Delphi XE2提供(offers)了令人兴奋(exciting)的新功能,让您能够建立高度可视化的,在Windows,Mac和iOS上的业务应用 ...

  5. (3.5)mysql基础深入——mysqld_safe脚本功能及流程

    (3.5)mysql基础深入——mysqld_safe脚本功能及流程 目录 1.mysqld_safe过程总结 2.mysql_safe启动的好处 3.mysqld_safe 参数 4.mysqld_ ...

  6. 使用PaxScript为Delphi应用增加对脚本的支持

    通过使用PaxScript可以为Delphi应用增加对脚本的支持. PaxScript支持paxC,paxBasic,paxPascle,paxJavaScript(对ECMA-262做了扩展) 四种 ...

  7. SpaceClaim脚本功能(Beta功能)

    本操作仅适用ANSYS SpaceClaim 2016 打开SpaceClaim脚本编辑器的方法有两种 方法一(看截图操作):         方法二(请见后面的实例操作). 创建球体源代码: #定义 ...

  8. 除了binlog2sql工具外,使用python脚本闪回数据(数据库误操作)

    利用binlog日志恢复数据库误操作数据 在人工手动进行一些数据库写操作的时候(比方说数据修改),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线 ...

  9. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

随机推荐

  1. Farpoint Spread 常用事件

    1 // 单元格编辑结束,焦点离开或者按回车键时 比如:你要判断当前单元格输入内容是否合法.private void fpSpread1_EditModeOff(object sender, Syst ...

  2. Pull和SAX解析的区别

    Pull解析器和SAX解析器虽有区别但也有相似性.他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束:而Pull解析器的工作方式为允许你的应 ...

  3. 收集的jquery插件

    1.精美jQuery分页插件 带滑动条分页使用HTML5实现刮刮卡效果 今天开始我们来收集一些jQuery分页插件,今天第一款jQuery分页插件适用于长翻页列表的分页应用,因为这款分页插件带有滑动条 ...

  4. Android 内部存储安装apk文件实现

    目前国内市场的山寨机横行,安卓手机升级也是一天一个样,对于原来老手机可能没有SDCARD,导致我们的APP不能下载资源,无法更新APP,针对这种情况有以下解决方案.通过以下函数判断是否有SD卡再判断下 ...

  5. mysql-connector-c 安装

    cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local make make install

  6. BaaS with Kinvey and Delphi 10.1 Berlin

    In this article I will show you how to connect yourdesktop and mobile applications to a mobile backe ...

  7. QT 一些非常常用的操作

    一   如果在窗体关闭前自行判断是否可关闭二   如何用打开和保存文件对话框  三   如何使用警告.信息等对话框  四   在Windows下Qt里为什么没有终端输出五   想在源代码中直接使用中文 ...

  8. iOS6与iOS7屏幕适配技巧

    一.没有包装任何 导航控制器 或者 UITabBarController 1.控制器的view是UIScrollView\UITableView\UICollectionView时(控制器是UITab ...

  9. Android模拟器PANIC: Could not open:问题解决方法

    最主要的就是环境变量没有配置或者我们使用的是绝对路径配置环境变量.这时我们只需要修改一下Android的环境变量就可以了. 具体解决方法如下: ①在环境变量中创建变量名:ANDROID_SDK_HOM ...

  10. 追踪神秘的成都Uber:月入2万元是现实还是传说

    4月6日,一个视频在网上疯转——在上海,明星佟大为驾驶着售价近100万元的特斯拉电动汽车,作为一名Uber的司机满市转悠着拉客. Uber——优步,如果你不知道这个词,那就OUT了.就是这样的一款软件 ...