当 TStoredProcedure 的参数方向是 pdOutput 时?
When direction for a parameter of a TStoredProcedure is pdOutput?
我正在使用 Delphi XE8 和 SQL Server 2014。
考虑以下存储过程:
CREATE PROCEDURE [dbo].[usp2_BaseShow_By_Id](
@ShowId int,
@Result int OUT
)
我使用这个Delphi代码来枚举它的参数:
function TDBHelper<T>.OpenSingle(ProcedureName:string; Args: TArray<Variant>;
Transform: TTransformFunc<T>): TDBResult<T>;
var
Con:TADOConnection;
Proc:TADOStoredProc;
ArgIndex,ParamIndex: Integer;
begin
Result:=TDBResult<T>.Create;
Con:=GetConnection;
Proc:=TADOStoredProc.Create(nil);
try
try
Proc.Connection:=Con;
Proc.ProcedureName:=ProcedureName;
Proc.Parameters.Clear;
Proc.Parameters.Refresh;
ArgIndex:=0;
for ParamIndex := 0 to Proc.Parameters.Count-1 do begin
if(Proc.Parameters[ParamIndex].Direction in [pdInput,pdInputOutput])then begin
Proc.Parameters[ParamIndex].Value:=Args[ArgIndex];
Inc(ArgIndex);
end;
end;
Proc.Open;
Result.Data:=Transform(Proc);
Result.Success:=True;
Proc.Close;
Con.Close;
except
on E:Exception do begin
Result.Success:=False;
Result.E:=E;
end;
end;
finally
Proc.Free;
Con.Free;
end;
end;
这告诉我参数有以下parameter direction:
pdReturnValue
为存储过程的结果。
pdInput
为存储过程的第一个参数。
pdInputOutput
为存储过程的第二个参数。
我对上面列表中的第 3 项感到惊讶。我本以为 pdOutput
。问题:
- 为什么这个参数是
pdInputOutput
而不是pdOutput
?
- 什么情况下参数会被认为是
pdOutput
?
Why is this parameter pdInputOutput
rather than pdOutput
?
因为尽管有OUT
关键字,参数还是用于输入和输出。请尝试以下操作:
CREATE PROC DoubleIt (@Value int OUT)
AS
SET @Value = @Value * 2
GO
DECLARE @Val int = 3
exec DoubleIt @Val OUTPUT
PRINT @Val
您会注意到 @Value
同时用作输入和输出。
In what circumstances would a parameter be deemed to be pdOutput
?
您可以手动创建参数。不幸的是,我目前无法轻易测试它。还有可能有其他数据库平台支持它。
What should I do in my stored procedure in SQL Server to have a pdOutput
parameter in Delphi?
我认为您在 SQL 服务器中无能为力。我不知道有什么方法可以将参数定义为 output-only.
我正在使用 Delphi XE8 和 SQL Server 2014。
考虑以下存储过程:
CREATE PROCEDURE [dbo].[usp2_BaseShow_By_Id](
@ShowId int,
@Result int OUT
)
我使用这个Delphi代码来枚举它的参数:
function TDBHelper<T>.OpenSingle(ProcedureName:string; Args: TArray<Variant>;
Transform: TTransformFunc<T>): TDBResult<T>;
var
Con:TADOConnection;
Proc:TADOStoredProc;
ArgIndex,ParamIndex: Integer;
begin
Result:=TDBResult<T>.Create;
Con:=GetConnection;
Proc:=TADOStoredProc.Create(nil);
try
try
Proc.Connection:=Con;
Proc.ProcedureName:=ProcedureName;
Proc.Parameters.Clear;
Proc.Parameters.Refresh;
ArgIndex:=0;
for ParamIndex := 0 to Proc.Parameters.Count-1 do begin
if(Proc.Parameters[ParamIndex].Direction in [pdInput,pdInputOutput])then begin
Proc.Parameters[ParamIndex].Value:=Args[ArgIndex];
Inc(ArgIndex);
end;
end;
Proc.Open;
Result.Data:=Transform(Proc);
Result.Success:=True;
Proc.Close;
Con.Close;
except
on E:Exception do begin
Result.Success:=False;
Result.E:=E;
end;
end;
finally
Proc.Free;
Con.Free;
end;
end;
这告诉我参数有以下parameter direction:
pdReturnValue
为存储过程的结果。pdInput
为存储过程的第一个参数。pdInputOutput
为存储过程的第二个参数。
我对上面列表中的第 3 项感到惊讶。我本以为 pdOutput
。问题:
- 为什么这个参数是
pdInputOutput
而不是pdOutput
? - 什么情况下参数会被认为是
pdOutput
?
Why is this parameter
pdInputOutput
rather thanpdOutput
?
因为尽管有OUT
关键字,参数还是用于输入和输出。请尝试以下操作:
CREATE PROC DoubleIt (@Value int OUT)
AS
SET @Value = @Value * 2
GO
DECLARE @Val int = 3
exec DoubleIt @Val OUTPUT
PRINT @Val
您会注意到 @Value
同时用作输入和输出。
In what circumstances would a parameter be deemed to be
pdOutput
?
您可以手动创建参数。不幸的是,我目前无法轻易测试它。还有可能有其他数据库平台支持它。
What should I do in my stored procedure in SQL Server to have a
pdOutput
parameter in Delphi?
我认为您在 SQL 服务器中无能为力。我不知道有什么方法可以将参数定义为 output-only.