现在位置:主页>网络/分布式> 文章内容

Delphi分布式系统(MIDAS)中动态调用存储过程

我要投稿更新日期:2008-07-07 点击:
一、前言

 

现在,多层应用程序已经和其他计算机技术一样越来越多地被谈论。多层应用程序和传统的客户/服务器应用程序相比,前者有更多的优点。而B o r l a n d的Multitier Distr

ibuted Application Services Suite(MIDAS)可以更加快速的建立多层应用程序。

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;

上一页12 3 下一页
所有评论

评论列表


我也评论来评论! 点击此处参与本文评论

注意:本站采用匿名评论,请各位网友注意自己的言行