[入门级] Delphi+ADO能不能获取存储过程的返回值ReturnValue

时间:2022-10-15 00:26:32
CREATE PROCEDURE sp_TEST
(
。。。。。
)
AS

IF NOT EXISTS(SELECT [xxx] FROM [xxx1]  WHERE [xxx]=@ID)
             GOTO Fail;
......
........

Fail:
RETURN -101  --要在Delphi中取得这个值
GO
_______________________________________________

ADO的StordProc控件能设置pdReturnValue的Parameters
但执行后取值总是报错,‘Invail parameters number’,
各位能不能给个例子,谢谢!

6 个解决方案

#1


var
 tmp:integer;
begin
with stordproc1 do 
begin
 close;
 procedurename:='sp_TEST';
 parameters[0].value:=123;
 parameters[1]:=..;
 open;
 tmp:=parameters[0].value;

end;




#2


可以实现的

在  ADOStoredProc1.ExecProc 语句后
XXX := ADOStoredProc1.FieldByName('Return_Value').AsString;

#3


可以的, 應該
parameeters[0] 就是了

#4


刚才太着急了,这样就可以:


   StoredProc:=TADOStoredProc.Create(nil);
   try
      StoredProc.Connection := Conn;
      StoredProc.ProcedureName := 'sp_TEST';
      StoredProc.Parameters.CreateParameter('@RETURN_VALUE', ftInteger, pdReturnValue, 0,0);
      StoredProc.Parameters.CreateParameter('vID', ftString, pdInput, 30, '11');
      StoredProc.Prepared := True;
      StoredProc.ExecProc;
      if(StoredProc.Parameters[0].Value=0) then
        ShowMessage(' ok~~! ')
      else
        ShowMessage(StoredProc.Parameters[0].Value);
      finally
        StoredProc.Free;
   end;


大家再帮我看看,这样判断存储过程正常结束是否可行?

#5


这个存储过程接受两个参数。第一个参数是@percentage,由客户端应用程序传递给存储过程,用来决定员工加薪的幅度。第二个参数 RecCount,也由客户端应用程序传递给存储过程,用来储存有多少笔数据被这个存储过程处理过,而且这个参数也会传递回客户端应用程序,因此它是一个双向传递的参数。这个存储过程 RaiseSalary的工作,是根据
@percentage参数来更新ADOTestDatas数据表中Salary字段的数值,最后把处理的
总笔数指定给第二个参数RecCount。
CREATE PROCEDURE RaiseSalary @percentage int, @RecCount int OUTPUT
AS
begin
update ADOTestDatas set Salary = Salary + Salary * (@percentage / 100)
set @RecCount = @@rowcount
end
1) 关闭Delphi集成开发环境中所有的项目,并且建立一个新的应用程序项目。
2) 在主窗体中放入 TADOConnection组件、 TADODataSet组件连接到
ADOTestDatas数据表。
3) 放入TDataSource组件,设定它的DataSet为步骤2) 的TADODataSet。
4) 放入TDBNavigator、TDBGrid组件,设定它们的 DataSource属性值为步骤
   3) 的TDataSource组件。
5) 放入TEdit和TButton组件。
6) 最后放入一个TADOStoredProc组件以连接到RaiseSalary存储过程。
7) 设定TADOStoredProc组件的TADOConnection为步骤2) 的TADOConnection,
再点选它的ProcedureName属性。从下拉框中选择连接RaiseSalary存储过程。
8) 双击TADOStoredProc组件的Parameters属性,在TADOStoredProc组件的Parameters属性中可以看到, TADOStoredProc组件已经从存储过程中取得了参数以及参数类型的信息。
9) 双击主窗体中的调用存储过程按钮,并且在它的 OnClick事件处理程序中撰
写如下的程序代码:
procedure TForm1.Button2Click(Sender: TObject);
begin
adospTest.Parameters.ParamByName('@percentage').Value := 1;
adospTest.Parameters.ParamByName('@RecCount').Value := 0;
adospTest.ExecProc;
edtOut.Text :=IntToStr(adospTest.Parameters.ParamByName('@RecCount').Value);
adodsTest.Refresh;
end;
adospTest便是步骤6加入的TADOStoredProc组件的名称。上面的程序代码首
先通过Parameters对象的ParamByName方法取得要传递给存储过程的 @percentage
参数,然后设定它的数值为 1。接着使用相同的方法取得 @RecCount参数并且设定
它的数值为0。最后调用adospTest的ExecProc方法以调用数据库中的存储过程。
当存储过程 RaiseSalary执行完毕之后,我们再从 Parameters属性中取出
@RecCount参数的回传数值,把它显示在主窗体的 TEdit控件中,并且调用步骤 2)
的ADODataSet的Refresh方法重新取得加薪之后的数据。



#6


这个问题问得挺菜的,结了。 ^_^b

#1


var
 tmp:integer;
begin
with stordproc1 do 
begin
 close;
 procedurename:='sp_TEST';
 parameters[0].value:=123;
 parameters[1]:=..;
 open;
 tmp:=parameters[0].value;

end;




#2


可以实现的

在  ADOStoredProc1.ExecProc 语句后
XXX := ADOStoredProc1.FieldByName('Return_Value').AsString;

#3


可以的, 應該
parameeters[0] 就是了

#4


刚才太着急了,这样就可以:


   StoredProc:=TADOStoredProc.Create(nil);
   try
      StoredProc.Connection := Conn;
      StoredProc.ProcedureName := 'sp_TEST';
      StoredProc.Parameters.CreateParameter('@RETURN_VALUE', ftInteger, pdReturnValue, 0,0);
      StoredProc.Parameters.CreateParameter('vID', ftString, pdInput, 30, '11');
      StoredProc.Prepared := True;
      StoredProc.ExecProc;
      if(StoredProc.Parameters[0].Value=0) then
        ShowMessage(' ok~~! ')
      else
        ShowMessage(StoredProc.Parameters[0].Value);
      finally
        StoredProc.Free;
   end;


大家再帮我看看,这样判断存储过程正常结束是否可行?

#5


这个存储过程接受两个参数。第一个参数是@percentage,由客户端应用程序传递给存储过程,用来决定员工加薪的幅度。第二个参数 RecCount,也由客户端应用程序传递给存储过程,用来储存有多少笔数据被这个存储过程处理过,而且这个参数也会传递回客户端应用程序,因此它是一个双向传递的参数。这个存储过程 RaiseSalary的工作,是根据
@percentage参数来更新ADOTestDatas数据表中Salary字段的数值,最后把处理的
总笔数指定给第二个参数RecCount。
CREATE PROCEDURE RaiseSalary @percentage int, @RecCount int OUTPUT
AS
begin
update ADOTestDatas set Salary = Salary + Salary * (@percentage / 100)
set @RecCount = @@rowcount
end
1) 关闭Delphi集成开发环境中所有的项目,并且建立一个新的应用程序项目。
2) 在主窗体中放入 TADOConnection组件、 TADODataSet组件连接到
ADOTestDatas数据表。
3) 放入TDataSource组件,设定它的DataSet为步骤2) 的TADODataSet。
4) 放入TDBNavigator、TDBGrid组件,设定它们的 DataSource属性值为步骤
   3) 的TDataSource组件。
5) 放入TEdit和TButton组件。
6) 最后放入一个TADOStoredProc组件以连接到RaiseSalary存储过程。
7) 设定TADOStoredProc组件的TADOConnection为步骤2) 的TADOConnection,
再点选它的ProcedureName属性。从下拉框中选择连接RaiseSalary存储过程。
8) 双击TADOStoredProc组件的Parameters属性,在TADOStoredProc组件的Parameters属性中可以看到, TADOStoredProc组件已经从存储过程中取得了参数以及参数类型的信息。
9) 双击主窗体中的调用存储过程按钮,并且在它的 OnClick事件处理程序中撰
写如下的程序代码:
procedure TForm1.Button2Click(Sender: TObject);
begin
adospTest.Parameters.ParamByName('@percentage').Value := 1;
adospTest.Parameters.ParamByName('@RecCount').Value := 0;
adospTest.ExecProc;
edtOut.Text :=IntToStr(adospTest.Parameters.ParamByName('@RecCount').Value);
adodsTest.Refresh;
end;
adospTest便是步骤6加入的TADOStoredProc组件的名称。上面的程序代码首
先通过Parameters对象的ParamByName方法取得要传递给存储过程的 @percentage
参数,然后设定它的数值为 1。接着使用相同的方法取得 @RecCount参数并且设定
它的数值为0。最后调用adospTest的ExecProc方法以调用数据库中的存储过程。
当存储过程 RaiseSalary执行完毕之后,我们再从 Parameters属性中取出
@RecCount参数的回传数值,把它显示在主窗体的 TEdit控件中,并且调用步骤 2)
的ADODataSet的Refresh方法重新取得加薪之后的数据。



#6


这个问题问得挺菜的,结了。 ^_^b