为何在三层结构中使用TClientDataSet执行存储过程出错?(100分)

L

Lilin

Unregistered / Unconfirmed
GUEST, unregistred user!
在三层结构我Server端的RDM中放一个TStoredProc,TProvider分别相应设置。
然后在Client端放一个TClientDataSet,并使用'Fetch Params'得到参数。
使用如下代码执行存储过程

with cdsMySp do
begin
Close;
//传入输入参数
Params[0].AsString := 'xxx';
Params[1].AsString := 'yyy';
Open;
//获得输出参数
Caption := Params[2].AsString;
end;

在执行总是出现"error creating cursor handle"的错误信息,
请问应该如何正确使用TClientDataSet执行存储过程。
(用DCOM连接、后端数据库为ORACLE 7.33)

Thank you very mcuh !
 
执行到哪里出错?估计和连接方式无关。
存储过程做了什么呢?
 
我在二层结构下可以顺利执行。
 
with cdsMySp do
begin
Close;
//传入输入参数
Params[0].AsString := 'xxx';
Params[1].AsString := 'yyy';
//Open;
ExecSQL;
//获得输出参数
Caption := Params[2].AsString;
end;
 
delphiwolf老兄
TClientDataSet没有ExecSQL方法吧!
 
来自delphiboy在论谈上的回答:

标题:用法不对
ID:14536 作者:delphiboy 邮箱:delphiboy@263.net 发表时间:1999.9.1 07:52:44
------------------------------------------------------------------------
详细内容:
看来你对TDataset的理解还太肤浅。

当调用Open时,是告知Delphi有数据集要从DB中返回时,Delphi会进一步创建一个Cursor以便你能够遍历数据集。而事实上在此处是执行一个存储过程而已,当然就会出错了。

在三层结构下,标准的执行存储过程的方法是在AppServer端增加一个接口方法,该接口方法调用TStoredProc执行存储过程;客户端通过调用该接口方法即可(注意:根本不应该使用什么TProvider!)。

假如你非要用TClientDataset来执行存储过程(非常别扭!),那也行,在三层体系下事实上是无所不能。方法是在你的存储过程最后增加一条返回数据集的语句,最简单的是返回一个常数,例如select 1,这样可以让SQL Server为你建立一个数据集返回给Delphi。

另外还有一个比较绝的方法可以建立一个通用的执行任意存储过程的接口方法,是通过TQuery做。自己思考一下具体步骤吧!

各位大位还有什么意见?
希望delphiboy快来拿分!!!
 
多人接受答案了。
 
ClientDataSet1.Execute
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部