1. 程式人生 > >在Delphi中如何獲得SQL中存儲過程的返回值?

在Delphi中如何獲得SQL中存儲過程的返回值?

The 獲得 bool row message stock then 數據 rcu

示例存儲過程:
create procedure proc_login
username varchar(20),
password varchar(20)
as
declare @result int
select @result=count(*) from loginuser where user=@username and pass=@password
if @result=0
return 0
return 1
go

Delphi代碼:
var ret:integer;
......
with ADOStoredProc1 do
begin
Close;
ProcedureName:=‘proc_login‘;

Parameters.Clear;
Parameters.Refresh;
Parameters.ParamByName(‘@username‘).Value:= Edit1.text;
Parameters.ParamByName(‘@password‘).Value:= Edit2.text;
ExecProc;
ret:= Parameters.ParamByName(‘@return_value‘).Value;
end;


if ret=1 //用戶名密碼匹配

begin
//你想要的操作
end

示例二

在delphi中取存儲過程的返回值
Close;
SQL.Clear;
SQL.Text:=‘declare @ReturnCount int exec Pr_SelStockHead ‘‘‘+StockNo+‘‘‘,@ReturnCount output select @ReturnCount‘;
open;
CountNO:=fields[0].value;
cxtxtdtNameCSHYH.Text:=IntToStr(CountNO);
在sql語句裏面 如果有返回值的話,可以是用return 返回,,其他的都是參數返回,如果取參數的話 從 Parameters[1].Value 開始,如果取return 的返回值 要用Parameters[0].Value

調用存儲過程的方法,用adodataset控件
function TfrmPower_Cut.HasNewPowerCutInfo: Boolean;
begin
Result := False;
with spPower_Cut do //spPower_Cut為Tadostoredproc控件
begin
Close;
ProcedureName := ‘p_Has_PowerCut_Info‘;
with Parameters do
begin
Clear;
Refresh;
ParamByName(‘@BiggestID‘).Direction := pdInputOutput;
ParamByName(‘@BiggestID‘).Value := FPower_Cut_ID_Refresh;
ParamByName(‘@NoProcess‘).Direction := pdInputOutput;
ParamByName(‘@NoProcess‘).Value := FNoProcess;
ParamByName(‘@IsPassTimeAndNoProc‘).Direction := pdInputOutput;
ParamByName(‘@IsPassTimeAndNoProc‘).Value := FIsPassTimeAndNoProc;
ParamByName(‘@IsNearestTime‘).Direction := pdInputOutput;
ParamByName(‘@IsNearestTime‘).Value := FIsNearestTime;
ParamByName(‘@IsDelete‘).Direction := pdInputOutput;
ParamByName(‘@IsDelete‘).Value := FIsNearestTime;
ParamByName(‘@Hour‘).Value := 3;
end;
Prepared;
try
ExecProc;
if Parameters[0].Value <> FPower_Cut_ID_Refresh then
begin
FPower_Cut_ID_Refresh := Parameters[1].Value;
Result := True;
end;
if Parameters[2].Value <> FNoProcess then
begin
FNoProcess := Parameters[2].Value;
Result := True;
end;
if Parameters[3].Value <> FIsPassTimeAndNoProc then
begin
FIsPassTimeAndNoProc := Parameters[3].Value;
Result := True;
end;
if Parameters[4].Value <> FIsNearestTime then
begin
FIsNearestTime := Parameters[4].Value;
Result := True;
end;
if Parameters[5].Value <> FIsDelete then
begin
FIsDelete := Parameters[5].Value;
Result := True;
end;
except
on e: Exception do
ShowMessage(e.Message);
end;
end;
end;
存儲過程
/*
功能: 判斷數據庫內是否有新的呼叫中心停電信息
參數: @BiggestID 客戶端最大的記錄ID,如果小於當前表中的ID,則返回最大的ID,客戶端據此判斷是否刷新
返回值: 無
*/
ALTER procedure p_Has_PowerCut_Info @BiggestID bigint=0 output, @NoProcess int=0 output,
@IsPassTimeAndNoProc int=0 output, @IsNearestTime int=0 output, @IsDelete int=0 output, @Hour int=3 as
begin
declare @tmp_ID bigint,@tmp_NoProcess int
select @tmp_ID=Power_Cut_ID from Power_Cut
if (@@error=0) and (@@rowcount>0)
if @tmp_id>@BiggestID
set @BiggestID=@tmp_ID
select @tmp_NoProcess=count(*) from Power_Cut where PC_ProcType=0
if (@@error=0) and (@@rowcount>0)
set @NoProcess=@tmp_NoProcess
--超過發送時間未處理
select @IsPassTimeAndNoProc=count(case when (getdate()>PC_StartTime and PC_ProcType=0) then 1 end) from Power_Cut
--距離發送時間還有3小時未處理
select @IsNearestTime=count(case when (DATEDIFF(minute, getdate(), PC_StartTime)>=0 and DATEDIFF(minute, getdate(), PC_StartTime)<@Hour*60
and PC_ProcType=0) then 1 end) from Power_Cut
select @IsDelete=count(*) from Power_Cut where PC_State=2
return @BiggestID
end
return 返回的是正確或錯誤的標誌,比如 100: 成功 0: 失敗(未知原因) 1: 參數錯誤 2: .... 然後參數裏面返回具體需要的數據

在Delphi中如何獲得SQL中存儲過程的返回值?