客户端调用中间层接口取返回值出错??(100分)

  • 主题发起人 主题发起人 kingbc
  • 开始时间 开始时间
K

kingbc

Unregistered / Unconfirmed
GUEST, unregistred user!
我在中间层定义了个接口SetProcName(sProcName: WideString), 在这个接口我把从客户端传过来的存储过程名称
赋给了远程数据模块中存储过程控件,如下:
ADOStoredProc1.ProcedureName := sProcName;
然后在客户端调用该接口,
SockConn.AppServer.SetProcName(sProcName);
再通过ClientDataSet创建Params并赋值、执行
问题是,虽然存储过程是成功执行了,但却得不到返回值,关于返回值 有下面两句:
Params.CreateParam( ftInteger, 'result', ptResult);
............................
iErrMsg := Params.ParamByName('result').AsInteger;
错误提示"ClientDataSet: Parameter 'result' not found"
不知道什么原因,是否这种调用存储过程的方式不太好??
 
不好,理论上说,客户端不应该知道数据库服务器上的
存储过程的名字。你应该按业务划分功能,提交一个功能要求,
让中间层执行,返回一个结果就行了.
 
因为现在我们要求不要改动的太多,所以原来二层调用存储过程的方式几乎不变
现在我可以得到中间层传回的参数值,如: @vc_message, ptOutput
但是,我要得到存储过程是否成功执行返回的结果,result,是在SQL server2000的
我已如上面创建了参数,却提示错误信息 result not found
大家调用存储过程是自怎么样的呢?
 
后来我发现ADODataSet与ClientDataSet的参数都不同
所以,得不到返回值
最后我不得不在服务器端定义一个方法获得客户端传来的参数,
包括存储过程名和它的参数
还定义了两个函数ParametersToVariant, VariantToParameters对ADODataSet的参数进行转化
 
1、问题产生的原因是,你的
SetprocName函数和ClientDataSet的Open分别产生了一个COM,所以,结果是
SetProcName给了COM A,而ClientDataSet。Open又产生了COM B
COM B中的对象和你在设计其看到的一样。当然没有你要的参数了。
2、解决方法,把参数也同时送上去(楼主已做),
同时将SP的结果直接通过这个函数返回,由客户端进行处理。
可以参考这个帖子。
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1473221
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部