如何用Delphi 调用带 output 参数的存储过程。(100分)

  • 主题发起人 主题发起人 Demaths
  • 开始时间 开始时间
D

Demaths

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一个带多个 output 参数的存储过程,请问如何在delphi 中调用它,
即希望能在 delphi 中得到 output 参数返回的值。
 
好像是用ParambyName来取值的。
 
在一般的程序中
ADO: ADOStoredProc1.Parameters.ParamByName('@out').value;
BDE: StoredProc1.Params.ParamByName9'@out').AsInteger ;
多层结构当然使用CDS.Params.ParamByName('@out').AsInteger;
 
应该是StoredProc1.Params.ParamByName('@out').AsInteger ;
 
在 Delphi 中,我使用以下语句
with data_frm.output_sp do
begin
if active = True then close;
StoredProcName:='enterprise_car_line_query_test;1';
try
prepare;
parambyname('@inp').AsString:= '1000100122';
outp0:=params.parambyname('@outp0').AsString;
outp1:=params.parambyname('@outp1').asinteger;
outp2:=params.parambyname('@outp2').asinteger;
ExecProc;
unprepare;
except
on E: EdatabaseError do
showmessage(E.message + #13 +'数据处理失败');
end;
end;

系统返回提示:
General SQL error
[Microsoft][ODBC SQL Server Driver] Indicator Variable
required but not supplied

存储过程如下:

create procedure enterprise_car_line_query1
(
@inp char(10),
@outp0 varchar(10) output,
@outp1 int output,
@outp2 int output
)
as

select distinct @outp0= 姓名 from 联系人 where 编码=@inp and 人员类型='1002'
create table #temp_tab_erc
(
车辆编号 char(10),
业户编码 char(10),
额定载量 real,
车辆等级 char(4)
)

insert #temp_tab_erc select tc.车辆号码, c.业户编码, c.额定载量, tc.车辆等级
from transfer_cert as tc, car as c
where tc.车辆号码=c.车辆编号 and c.业户编码=@inp

select @outp1=count(车辆编号), @outp2=sum(额定载量) from #temp_tab_erc
where 额定载量 > 30
go

在 SQL Server 的 Query 中,用以下语句可执行成功。

declare @o varchar(10),@o1 int, @o2 int
select @o='', @o1 = 0 ,@o2 =0
exec enterprise_car_line_query1 '1000100175', @o output,@o1 output, @o2 output
select @o, @o1 ,@o2
go

在 Delphi 中执行不成功是否因为在参数中没有传递 output 的信息。
如何解决。是否要在 data_frm.output_sp 的 params 编辑栏中,把 params type 设置
为 ptoutput.但我试过也不行。





 
在DELPHI中可行的,
SQL.Add('declare @o varchar(10),@o1 int, @o2 int');
SQL.Add('Exec("enterprise_car_line_query1 "'+@output1+'".....');
SQL.Add('select @output1 as out1....');
Open;
out1:=FieldbyName('out1').asString;
 
最EASY 的方法:
storedproc1.Prepare;
storedproc1.ExecProc;
out1:=storedproc1.params.value;
or out1:=storedproc1.params.asinteger( .........;
 
如果你是用在一般的程序中,不用将定义为OUTPUT的参数赋值的,但是,在参数的DATATYPE
中要定义为PTOUTPUT类型。
 
接受答案了.
 
后退
顶部