请教简单的存储过程的问题(50分)

  • 主题发起人 主题发起人 ttaa
  • 开始时间 开始时间
T

ttaa

Unregistered / Unconfirmed
GUEST, unregistred user!
我还没有写过存储过程,想学一下,很简单的都不懂。抱歉。
slq server 2000里的表:planfile

model prodno qty
.. 991000 ..
.. .. ..
.. 991087 ..
.. .. ..
.. 992000 ..
.. .. ..
.. 992054 ..
.. .. ..
.. 993000 ..
.. .. ..
.. 993076 ..

我要找出各组(9910,9920,9930)的最大值。学习用存储过程来做。
在sql中我写的存储过程:
if exists(select name from sysobjects where name='prodnomax'
and type='p')
drop procedure prodnomax
go
create procedure prodnomax @ph char(4) as
select max(prodno) from planfile where left(prodno,4)=@ph

在delphi中ADOConnection1已连上了苏据库。ADOStoredProc1也连好了ADOConnection1。
以下我的语句:

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOStoredProc1.Parameters.ParamByName('@ph').Value :='9920';
ADOStoredProc1.Prepared;
adostoredproc1.ExecProc;
{
showmessage(ADOStoredProc1.Parameters.ParamByName('@ph').astring);
showmessage(ADOStoredProc1.fieldbyname('@ph').astring);
showmessage(adostoredproc1.Fields[0].Value);
}
end;
{}里的语句都会产生错误。怎样得到992054这个值?
 
showmessage(adostoredproc1.Fields[0].asstring);
 
存储过程有误。
没有设定输出变量,而且你选择出来的max(prodno)并没有保存到任何变量中以返回到
delphi的调用处。
 
showmessage(ADOStoredProc1.Parameters.ParamByName('@ph').Value);
 
ok ,armyjiang
 
to ericimex01:
如果在adostoredproc1中的parameters中的@ph写入值,以下的才正确:
adostoredproc1.ExecProc;
showmessage(adostoredproc1.Fields[0].asstring);
to jixiaoyu:显示错误的,编译都不通过。
to armyjiang:那该怎么做?是这样吗?
create procedure prodnomax @ph char(4),@prodno_max char(7) output as
select max(prodno) from planfile where left(prodno,4)=@ph
怎样取出@prodno_max的值呢?
 
create procedure prodnomax @ph char(4),@prodno_max char(7) output as
select @prodno_max=max(prodno) from planfile where left(prodno,4)=@ph
 
to 金鑫兄:在delphi 的adostoredproc1怎样获得 @prodno_max的值?
 
这样搞定。
showmessage(adostoredproc1.Parameters.ParamByName('@prodno_max').Value);
还有其他方法不?
 
就是这样啦,你说其他方法是什么意思?
 
你写的存储过程和你要实现的功能是不相符的。
你想得到一个结果集,实际上却在创建一个存储过程!
第一行开始的IF语句是用来删除一个可能存在的存储过程,下面一句则是创建一个存储过程。
所以再怎么做都是得不到想要的结果的!而且这个写法SQL SERVER是不会承认的,除非是用外部
编辑器,那样的话,那么你一定是没有给adostoredproc指定PROCDURENAME。
想要得到从存储过程中输出的一个变量值,在声明该变量时,必需要用OUTPUT来标识。如:
declare @ph char(4) OUTPUT
在未标识的情况下,SQL默认它为输入变量。
只要标识正确,adostored的用法和adoquery的用法是差不多的。
给你举个例子:
//创建存储过程:(在QUERY中可以执行)
create procedure prodnomax
@ph char(4),
@pout int output
as
select @pout = max(prodno) from planfile where left(prodno,4)=@ph

//程序中的调用:
...
with adostoredproc1 do
begin
Parameters.Clear;
Parameters.add;
parameters[0].value := '9920';
execproc;
showmessage(fieldbyname('@pout').value);
end;
...
 
to armyjiang:意思是
除了adostoredproc1.Parameters.ParamByName('@prodno_max').Value得到它的值外,
还可以用什么语句?
to dlnew:你误会我的意思了。我是在sql的查询分析器已经写好了存储过程。
并不是在delphi中写。只是在delphi中获得它的返回值。
 
多人接受答案了。
 
后退
顶部