桃花影落飞神剑:--各位FW请进!讨论3层中client向应用服务层传递参数的问题。(300)(300分)

  • 主题发起人 主题发起人 jrq
  • 开始时间 开始时间
J

jrq

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:好! 有礼了。 求救!

先看一段旧帖的内容:(ID号没有抄下来,忘了)
-------------------
在sql server中定义一个存储过程:
CREATE PROCEDURE selecta @a int,@retval int output AS
select @retval=count(*) from a
where a =@a
---------------
服务器端调用存储过程的方法定义如下:
function TDM_update.update(a:Integer):integer;
begin
ADOStoredProc1.Parameters.ParamByName('@a').value:= a;//查询参数
ADOStoredProc1.Parameters.ParamByName('@Retval').value:= 0;
ADOStoredProc1.ExecProc;
result:=ADOStoredProc1.Parameters.ParamByName('@retval').value;//回传结果
end;
----------------
客户端调用服务端的方法如下:
var
i:integer;
i:=strtoint(edit1.text)//从edit1.text输入数据
edit2.text:=inttostr(dcomconnection.appserver.update(i));
//edit2.text显示执行结果
------------------------------------
上面代码: 客户端这句 dcomconnection.appserver.update(i));只传递了一个参数给服务端的方法来调用存储过程,
现在我要传递几十个,甚至上百个参数给应用程序服务器使用调用存储过程(存储过程中有相应的参数),我该怎么办啊?
是不是我要定义的方法中,要包含了这几十个、上百个参数来传递,一一列出来?
象这样 dcomconnection.appserver.method1(a,b,c,d,f,g,h,i,j,k,l,.....,var x,y,z,w,y,q,n,p,m,.....//回传参数)

这个太残忍了吧,系统能承受吗? 速度问题呢? 我是在局域网内使用的。
怎么写才合适呢? 望做过这方面东东的大侠们指点迷津。 求救您了!! 谢谢!
 
我不想在客户端用ClientDataSet这种方式调用存储过程传递参数(服务端StoredProc和DataSetProvider联接):
with ClientDataSet1 do
begin
Close; //传入输入参数
Params[0].AsString := 'xxx';
Params[1].AsString := 'yyy';
Open;
//获得输出参数
Caption := Params[2].AsString;
end;
 
jrq老兄
我的QQ是10503283
上次给你留了,你可能没看到!
呵呵,还是帮不上你,提前
 
to 哈利老弟:
哈 QQ我早就通过你的验证了啊!
多谢提前!
 
请兄弟们 帮忙提前一下,好吗?
多谢!
 
是不是有数组作参数的,不好意思,偶未用过。
参数能有多大?局域网内速度不是问题的说。
 
小事了﹐我們是這樣做的。 定義olevariant類型吧﹐用數組傳遞。
只是要注意順序﹐沒辦法三層開發會有許多不便的。
A : OleVariant;
A := VarArrayCreate([0,10],varVariant);
A[0] :=
A[1] :=
''''''''''''''''''''''''''
要參數回調的話﹐別忘了將參數設成var
good luck ^_^
 
多谢楼上两位老兄指点。我就是这样用OleVariant;类型的。
但是没有用数组。 还好我传的参数现在不是太多。 我这就去试试。
----------------
不知nulk和coolzew两位老兄能否留下联系方法,小弟有事请教! 谢谢。
 
数组传递的确不错。 问题解决了,下载了最新了离线数据库看了看,类似的问题真是不少。
再问一个比较低级的问题:
A := VarArrayCreate([0,10],varVariant); 语句创建数组后,
这样等用完了,用不用手工释放A? 系统能自动释放吗?
 
来自:沉香屑, 时间:2002-9-11 20:32:00, ID:1319463
用TADODataSet调用
格式是这样的:
'{call reg.emp(:param1, :param2.......)}'
-----------------------------
在客户端用中间层的TADODataSet怎么向存储过程传递参数啊?
ADOStoredProc有属性可以得到存储过程中的参数,客户端赋值给参数,可以传递到存储过程。ADODataSet呢?
 
哈哈,不会吧,有这么多。可以这样试试:

function TDM_update.update(AParam: Variant): Integer;
begin
//在ParamValues[]中的字段名称列表要和Param对应起来。
ADOStoredProc1.Parameters.ParamValues['Field1;Field2;Field2...'] := AParam;
ADOStoredProc1.ExecProc;
result:=ADOStoredProc1.Parameters.ParamByName('@retval').value;//回传结果
end;

call:
var
Param: Variant;
begin
Param := VarArrayOf([Param1Value, Param2Value,....]);
edit2.text:=inttostr(dcomconnection.appserver.update(Param));
end;
 
多谢 copy_paste 大哥。
-----------------
现在参数传递已经成功了。不过新问题是:ADOStoredProc怎么才能得到Oracle存储过程的返回值?
请到:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1321421 领分。
ADOStoredProc能不能用ftCursor?

旧帖的讨论:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=0515742
http://www.delphibbs.com/delphibbs/dispq.asp?lid=559387
http://www.delphibbs.com/delphibbs/dispq.asp?lid=595956
---------------------------------------
来自:ggqq, 时间:2001-10-16 12:53:00, ID:675529
create or replace package spm
is
TYPE rctl IS REF CURSOR;
procedure proc1(aa number,bb number,rc1 in OUT rctl);
END;

create or replace package body spm
as
procedure proc1(aa number,bb number,rc1 in OUT rctl)
AS
BEGIN
OPEN rc1 FOR SELECT * FROM test;
END;
end;

另外,很重要的是,ADO的连接里面[red]一定要加上[/red]Extended Properties="PLSQLRSet=1"这一句
哎,当时我话了多少心血才得到的答案[:(][:(],现在就这么给了你了。[?]
就当大家交流交流吧![8D]
程序里这样:AdoStoredProc1.open;就可以得到返回的结果集,对AdoStoredProc1和adoquery一样的操作。
------------------------------------------------
 
哈! 折腾了几天了。今天中午终于将这个问题搞定!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1321421
很高兴。 感觉自己学了东西,有所进步。
爽快,痛快! 欣喜之情难言于表。

对上面诸位富翁的指点、教导深表感谢。谢谢诸位。

现在上来送分表示祝贺,并胡乱填了首不成调的长短句以示感悟和纪念:

《 蝶 恋 花 》

*编程感悟*

苦想冥思郁闷满,
求医问药,
尝试千万遍。
新帖旧帖仔细看,
潇潇微雨夜色晚。

自量不能方寸乱,
混沌懵然,
谁知深和浅?
等到事后语诸君:--
三层两层难亦然。

 
结束此贴,发分了。

多谢 楼上各位富翁的指导和指点。谢谢。
 
jrq你好呀
Extended Properties=PLSQLRSet=1这一句的确厉害。谢谢你的整理和贡献。
不过我在考虑,这样实现了返回数据集,又有何用途???如果运用在dbgrid中,还没有直接ADOQuery1或ADOTable有效,而且可以修改标题栏。

大家如此辛苦,搞出的答案,又何用途呢?愿用50分来闻其详
 
to cowbird:
您好!
您是说这个帖子吧? http://www.delphibbs.com/delphibbs/dispq.asp?lid=1321421
这是去年夏天给公司写的一套3层的东东。
大概是这样的:
考虑到分发和维护,客户端只是一个简单的录入和查询操作界面。
中间层的服务器则包含所有了的业务逻辑,其中要调用Oracle的存储过程进行数据逻辑处理并且要过滤返回一些数据供客户端查询使用。
系统中对数据库所有操作的SQL全部封装成了Oracle的程序包体,即在客户端程序和中间层服务程序中都是没有写SQL语句的。
上面的帖子就是解决了中间层服务器用ADO连接Oracle时调用存储过程返回数据集时的情况,然后就可以处理这个数据集根据需要把相关信息返回到客户端。
在客户端没有用DBGrid,我用的是TTreeView,建了一棵数据树来显示数据,这样可操作性还好一点。
 
后退
顶部