推荐内容
现在,多层应用程序已经和其他计算机技术一样越来越多地被谈论。多层应用程序和传统的客户/服务器应用程序相比,前者有更多的优点。而B o r l a n d的Multitier Distr
MIADS中通过服务端DataSetProvider组件和客户端ClientDataSet组件对数据集的操作进行良好的封装,但到对存储过程的调用却有些不足之处---对于存储过程没有result返回的不能进行客户端调用/有result的客户端不能取到result的返回值。所以本文讲述一种在MIDAS中动态调用存储过程的技巧。
二、原理说明
1. 在客户端添加SocketConnection(或DCOMConnection)和ClientDataSet并进行相应关联设定。
2. 添加ADOStoredProc组件,对ADOStoredProc的ProcedureName和Parameters进行常规设定。
3. 通过MidasAdoProc过程(自行编写)把ADOStoredProc组件的信息转换为Variant数组,再用ClientDataSet的DataRequest方法把Variant数组上传。
4. 触发服务器DataSetProvider的OnDataRequest事件,在OnDataRequest对上传的Variant数组进行解析,用相应的信息更新服务器的ADOStoredProc组件。
5. 执行服务器的ADOStoredProc组件,转换服务器的ADOStoredProc组件的执行结果为Variant数组,将Variant数组回传客户端。
6. 客户端对用回传的Variant数组更新客户端的ADOStoredProc
7. 对本地ADOStoredProc进行执行后的常规操作
三、使用例程
3.1 例程环境
服务器端安装了ORACEL 9I数据库或ORACEL 9客户端数据库,数据库情况如下:
实例名my9i,用户will,用户密码will,在will用户下建立存存储过程TESTDELPH,脚本如下
CREATE OR REPLACE PROCEDURE TESTDELPHI (ins varchar,
outs out varchar) is
begin
outs:='my info ' || ins || 'ok';
return ;
end testdelphi;
编程工具DELPHI5(DELPHI6/7方法相同不过就是组件位置有些变化)
服务器主机ip:192.168.0.118,主机名will
3.2 公共函数midas_tools.pas
unit midas_tools;
interface
uses
DBClient,ADODB;
//Parameters转换为Variant数组
function ParametersToVariant(par:TParameters;ProcedureName:Variant): OleVariant;
//Variant数组转换到Parameters
function VariantToParameters(input:Variant;par:TParameters):Variant;
//MIDAS调用PROC的通用程序
procedure MidasAdoProc(MyProc:TADOStoredProc;MyClientDataSet:TClientDataSet);
implementation
//Parameters转换为Variant数组
function ParametersToVariant(par:TParameters;ProcedureName:Variant): OleVariant;
var
tmpv:Variant;
n,i:integer;
begin
tmpv:=VarArrayCreate([0,par.Count*5+1],VarVariant);
tmpv[0]:=ProcedureName;
tmpv[par.Count*5+1]:='this is fro Midas';
n:=0;
i:=0;
while par.Count>i do begin
tmpv[n+1]:=par.Items[i].Name;
tmpv[n+2]:=par.Items[i].DataType;
tmpv[n+3]:=par.Items[i].Direction;
tmpv[n+4]:=par.Items[i].Size;
tmpv[n+5]:=par.Items[i].Value;
i:=i+1;
n:=n+5;
end;
result:=tmpv;
end;
////Variant数组转换到Parameters
function VariantToParameters(input:Variant;par:TParameters):Variant;
var
n,i:integer;
begin
n:=0;
i:=0;
while VarArrayHighBound(input,1)>(n+5)do begin
par.CreateParameter(input[n+1],input[n+2],input[n+3],input[n+4],input[n+5]);
n:=n+5;
end;
result:=true;
end;
//MIDAS调用PROC的通用程序
procedure MidasAdoProc(MyProc:TADOStoredProc;MyClientDataSet:TClientDataSet);
var
ins,outs:Variant;






评论列表