2016-08-12 13 views
2

나는 고려 다음 저장 프로 시저를 2014TStoredProcedure의 매개 변수에 대한 방향이 pdOutput입니까? 매개 변수를 열거하는 난이 델파이 코드를 사용</p> <pre><code>CREATE PROCEDURE [dbo].[usp2_BaseShow_By_Id]( @ShowId int, @Result int OUT ) </code></pre> <p>:

를 델파이 XE8 및 SQL Server를 사용하고

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 :

  1. pdReturnValue 저장 프로 시저의 결과.
  2. pdInput 저장 프로 시저의 첫 번째 매개 변수입니다.
  3. pdInputOutput 저장 프로 시저의 두 번째 매개 변수입니다.

위 목록의 3 번 항목에 놀랐습니다. 나는 pdOutput을 기대했을 것입니다. 질문 :

  • 왜이 매개 변수가 pdOutput이 아닌 pdInputOutput입니까?
  • 어떤 상황에서 매개 변수는 pdOutput으로 간주됩니까?
+1

제 질문은 : 귀하의 게시물에 질문이 있습니까? 나는 진심으로 당신이 무엇을 요구하고 있는지 전혀 모른다. 질문의 제목은 문제가 발생했을 때 묻는 것으로 보입니다. –

+0

나는 또한 당신이 묻고있는 질문에 대해 궁금합니다. 아, 알았습니다. 왜 두 번째 매개 변수가'pdOutput'이 아닌'pdInputOutput'인지 궁금합니다. 그게 다야? –

+1

그런데'except' 블록이 완료되면'E'가 파괴됩니다. 그러나 당신은 객체에 대한 참조를 유지합니다. 대기중인 런타임 오류입니다. 그 일을 피하려면'AcquireExceptionObject'를 사용해야합니다. 'Free'를 호출 할 때'Close '를 호출하는 시점을 정말로 볼 수 없으며, 왜 예외를 잡는 것을 왜 귀찮게하는지 궁금합니다. 당신은 예외를 삼가는 것이 아닙니다. –

답변

1

이유는이 매개 변수 pdInputOutput보다는 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은 입력과 출력 모두로 사용되는 것을 알 수 있습니다.

어떤 상황에서 매개 변수는 pdOutput으로 간주됩니까?

수동으로 매개 변수를 만들 수 있습니다. 불행히도 나는이 순간을 쉽게 테스트 할 수 없다. 또한이를 지원하는 다른 데이터베이스 플랫폼이있을 수 있습니다.

SQL Server의 저장 프로 시저에서 Delphi에서 pdOutput 매개 변수를 사용하려면 어떻게해야합니까?

SQL Server에서 수행 할 수있는 작업이 없습니다. 매개 변수를 출력 전용으로 정의하는 방법을 알지 못합니다.

+0

질문을 수정하십시오. 나는 그들이 똑같은 것을 느꼈을 때 마지막 두 가지 질문을 병합했다. 이제 삭제 된 질문을 인용했습니다. * 어떤 상황에서 매개 변수는 pdOutput으로 간주됩니까? * SQL Server의 저장 프로 시저에서 델파이에서 pdOutput 매개 변수를 사용하려면 어떻게해야합니까? *? –

+0

@DavidHeffernan 원래 3 번째 질문을 추가했습니다. 특별한 질문을 일반적인 질문으로 굴려서 판단하기로 결정했기 때문입니다. 보시다시피, 각 질문에는 정반대의 대답이 있습니다. ... 나는 원래의 질문에 대해 당신과 편집 전쟁을 시작할 의사가 없다. 그럼에도 불구하고, 제 3의 질문에 대한 대답을 논평에서 명확하게 물어 보았습니다. –

+0

분명히 편집 전쟁은 원치 않습니다. 나는 내 추론을 설명하고 있었다. 나는 두 가지 질문의 차이점을 말할 수 없다. 출력 매개 변수를 정의하는 것이 불가능할 수도 있고 수동으로 만들 수도 있습니다. 분명히 나는 ​​뭔가를 이해하지 못하고있다. 나는 더 이상 편집을하지 않을 것이며, 당신이 그것을 정리할 수 있기를 희망합니다. –