SQL SERVER 7存储过程的问题(100分)

  • 主题发起人 主题发起人 pst
  • 开始时间 开始时间
P

pst

Unregistered / Unconfirmed
GUEST, unregistred user!
使用三层系统,使用SQL SERVER 7的存储过程,希望返回一个值,该怎么做?
 
看看那些SQL的书
 
在使用存储过程(Tstoredproc)时,用output型的参数,执行完存储过程后,参数的值就是
返回值
 
还是建议你先看看书。一般书上都有
 
是使用bde還是ADO?
 
这个我当然知道!
问题是这样的:
在三层结构中,因为要根据存储过程返回的值,来决定客户端执行相关的工作。
第一次执行时,没有问题,但是,再重复执行时,就会出现错误:
you have defined a parameter object
而这个参数在第一次是可以的。
 
这样的话,不如这样:
在执行存储过程前,先执行:clientdataSet1.FetchParams这个过程,来获得参数。
 
错误信息为:
Parameters '@p1' not found.
使用D5 + sql SerVER 7+ ADO
再问:
如果不使用返回值(@param int OUTPUT)的话,只使用RETURN_VALUE可以吗?
 
看你要返回什么了,过程中可以return integer(0~-99是系统的)
当然你也可以返回构造的SQL语句让别的过程来调用,可以
CREATE procedure mypro
@cSQL varchar(1024) output
as
.............select @cSQL="..."
return

这样调用:declare @cSQL char(1024)
exec mypro @cSQL OUTPUT
 
问题是返回值给DELPHI用!
ZENGR的方法是对的,但是,这样的话,不又增加了客户端向服务器发送数据的次数了,
在效率上是不是很合理呢?
 
我发现这里的人大都流于形式样,而解决问题的却没多少!叫人失望!
 
to Pst:
我帮你做了个全面测试。
过程如下:
1:先直接使用ADO来做。
ADO1 为仅需要一个参数的存储过程,利用其RETURN_VALUE来获得返回值。对应的存储过程为:
CREATE PROCEDURE demo
( @t1 char(7) )
AS
if not exists(select * from t_Chzl where t1=@t1) return 1000
else select t1,t3 from t_table where t1=@t1

ADO2使用两个参数,其中参数@out用来返回
CREATE PROCEDURE demo_1
(@t1 char(7) ,@out int OUTPUT )
AS
if not exists(select * from t_Chzl where t1=@t1) begin
set @out=101
return @out
end
else select t1,t3 from t_table where t1=@t1

两个存储过程在测试中都可以成功返回所需要的值。OK!


2、在三层结构中使用。
客户端对应两个ClientDataSet分别对应上边的两个名称。
2. 1 对ADO2进行处理:
因为在执行了CDS之后,ADO2对应的存储过程将返回值放在参数@out中,
所以执行完之后,ADO2的参数就只有@out一个了。从该参数可以获得你想要的值。
这也是在程序运行第二次时会出现“parameter '@p1'not found”的原因。
所以在执行了ClientDataSet一次之后,必须使用FETCHPARAMS来重新获得
APPSERVER传过来的参数!
2. 2对ADO1来处理:
关于这个,我有点疑惑:
A、对参数RETURN_VALUE也必须赋值!!
B、RETURN_VALUE并没有正确返回相关的值。
(你设置为多少,执行后,他还是多少!那么,这个参数在多层结构中有什么用呢?)
C、使用这个方法在执行后,却不需要重新再从APPSERVER端获得参数!

对于这个情况,我想再跟进一下,有结果再通知你吧。
 
如此说来,也只好这么着了,多谢大家!
TO ZENGR:有什么事情再跟你联系,好吗。
 
后退
顶部