请教各位大虾,关于sqlserver 2000的存储过程!(100分)

J

jbas

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟刚学c/s,
我在sqlserver 2000中写了一个存储过程,
CREATE PROCEDURE [dbo].[myproc1]
@dg char(20) ,@dh char(20),@eg char(20) output
AS
select @eg=BMNAME from BMTXB where (BMNX=@dg and BMWX=@dh)
GO

在客户端用adoquery怎样才能行呀,
当没有@eg输出参数时可以
procedure TForm1.Button1Click(Sender: TObject);
var
sg:string;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
sg:='execute myproc1 '+edit1.Text+', '+edit2.Text;
ADOQuery1.SQL.Add(sg);
ADOQuery1.open;
end;
但有了输出参数时,我怎样才能用edit3来接受这个返回值呀?
谢谢了!
 

with ADOQuery1 do
begin
Active:= False;
SQL.clear;
SQL.Add(' exec myproc1 :mad:p1,:mad:p2,:mad:p3 OutPut ');
Parameters.ParaByName('@P1').Value:= edit1.Text;
Parameters.ParaByName('@P2').Value:= edit2.Text;
ExecSQL;
edit3.Text:= Parameters.ParaByName('@P3').Value;
end;
采用上面的,把你的换掉,就ok了
 
procedure TForm1.Button1Click(Sender: TObject);
var
sg,sk:string;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
sg:='execute myproc1 :mm,:nn';
ADOQuery1.SQL.Add(sg);
adoquery1.Parameters.ParamByName('mm').Value:=edit1.Text;
adoquery1.Parameters.ParamByName('nn').Value:=edit2.Text;
ADOQuery1.open;
end;
这样也只能输入参数,但怎样接受储存过程的返回值呢?
 
笔误
把 Parameters.ParaByName全部改为 Paramters.ParamByName

edit3.Text:= Parameters.ParaByName('@P3').Value;
这样可以接受返回值了。
 
谢谢youngyxy, 老兄的鼎立相助,解决了!
能否再请教几个问题?
在参数上加不加‘@’好象没有关系的吧。改为P3也行。
如果我要返回多条记录,能以数组形式返回给客户端吗?怎么返回呀?
谢了!
要返回参数一定要用execsql,不管是否是select???????
 
procedure TForm1.Button1Click(Sender: TObject);
var
sg:string;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
sg:='execute myproc1 '+edit1.Text+', '+edit2.Text;
ADOQuery1.SQL.Add(sg);
ADOQuery1.open;
Edit3.text:=ADOQuery1.Fields[0].AsString;
end;
 
hong_flood老兄,你这样能算是返回值吗,如果返回的不是个字段,是个字段的最大值,等
那这样不行了吧。
 
to jbas
1、可以不使用 @
2、对于多个返回值,那么定义的 @eg char(20) Output就不适用了,发生歧义。
这种情况下,应该修改myproc1过程,去掉@eg参数,执行的时候使用ADOQuery1.Open
3、在delphi中间,处理这个ADOQuery1数据集,就是多个纪录的情况
Do you understand?
 
to youngyxy,
i don't understand.
你说的》》在delphi中间,处理这个ADOQuery1数据集,就是多个纪录的情况
指的是这个吗?
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
sg:='execute myproc1 '+edit1.Text+', '+edit2.Text;
ADOQuery1.SQL.Add(sg);
ADOQuery1.open;
ADOQuery1.first;
while not ADOQuery1.eof do
begin
listitem1.items.add(adoquery1.fields.fieldbyname('fe1').value);
next;
end;
可是上面的不通过,会死掉的。
再教一下我吧!谢了。
 
1、先把一个DBGrid连接这个ADOQuery1,看看
2、好像你的
listitem1.items.add(adoquery1.fields.fieldbyname('fe1').value);
需要改为:listitem1.items.add(ADOQuery1.FieldByName('BMNAME').Value);
或者listitem1.items.add(ADOQuery1.Fields[0].Value);
 
to youngyxy:
谢谢老兄的关注!可是还不行,我用静态的指定sql语句,静态的加参数给adoquery,用dbgrid
连,可以在dbgrid中显示,可用listbox来接收就不行了。
 
好像delphi中有专门执行存储过程的控件
 
with ADOQuery1 do
begin
Active:= False;
SQL.clear;
SQL.Add(' exec myproc1 :mad:p1,:mad:p2,:mad:p3 OutPut ');
Parameters.ParaByName('@P1').Value:= edit1.Text;
Parameters.ParaByName('@P2').Value:= edit2.Text;
ExecSQL;
edit3.Text:= Parameters.ParaByName('@P3').Value;
end;
 
谢谢各位的帮忙!
  可我要返回数组,用来给程序界面上的控件赋值,当然是多条数据。
怎么弄?
储存过程不能返回记录数组???????
 
为什么一定要用adoquery,用adostoredproc不行吗?
 
我想顺便问一下
我的adodaset怎么没有看到ParaByName属性
 
to spikelet:
自已写上就是了。
 
偶然通过了,祝贺了。
存储过程:
CREATE PROCEDURE [dbo].[TestQuer]
@Hth char(14)
AS
select * from HTB where HTYLBH=@Hth
GO

delphi中调用.
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
PListItem:TListItem;
begin
with ADOQuery1 do
begin
close;
sql.Clear;
sql.Add('exec TestQuer :Ht');
parameters.ParamByName('Ht').Value:='113';
open;
while not eof do
begin
PListItem:=ListView1.Items.Add;
PListItem.Caption:=fields.fieldbyname('HTGGDW').AsString;
PListItem.SubItems.Add(fields.fieldbyname('HTYLBH').AsString);
next;
end;
end;
end;

不能在sp中加Output 关键字,否则没有返回值.
 
多人接受答案了。
 
顶部