2009-07-21 2 views
8

많은 양의 SQL 쿼리를 저장 프로 시저로 변환해야합니다. 하나의 Delphi 절차에서 한 번에 약 20 개 또는 30 개의 값을 업데이트하는 코드가 있습니다. 그런 일을하기 위해 스토어드 프로 시저를 생성 할 수 있습니다.매개 변수를 TADOStoredProc에 전달하는 더 좋은 방법 (Delphi)

with stored_procedure do...... 
    Param := Parameters.AddParameter; 
    Param.Name := '@SSN'; 
    Param.Value := edtSSN.text; 

    Param := Parameters.AddParameter; 
    Param.Name := '@FirstName'; 
    Param.Value := edtFirstName.Text; 

    Param := Parameters.AddParameter; 
    Param.Name := '@LastName'; 
    Param.Value := edtLastName.Text; 

    Param := Parameters.AddParameter; 
    Param.Name := '@UserRID'; 
    Param.Value:= GetRIDFromCombo(cbUser); 

나는 또한 메모리 누수 (? 그것은 같은 TParameter 개체를 확보 할 필요가있다)

발생하는 경우 확실하지 않다 : 문제는 저장 프로 시저에 매개 변수를 전달하는 내 방식이 같은 매우 부피입니다 누구나 많은 양의 매개 변수를 처리하는 더 나은 방법이 있습니까? (나는 새로운 라이브러리를 사용할 수 없다 .ADO를 사용해야하고, 사용하는 SQL은 MSSQL이다.) (또한 ADO.net을 사용하지 않는다)

답변

11

이것은 메모리 누출의 원인이되지 않는다. stored_procedure는 매개 변수를 정리합니다. .dpr에 다음을 추가하여 FastMM을 확인할 수 있습니다.

ReportMemoryLeaksOnShutdown := True; 

먼저 "with"문을 제거합니다. 더 많은 문제와 덜 읽을 수있는 코드로 이어질 수 있습니다.

저장 프로 시저, 매개 변수 이름 및 매개 변수 값을 허용하는 도우미 메서드를 만들면 코드를보다 쉽게 ​​관리 할 수 ​​있습니다.

AddParam(stored_procedure, '@SSN', edtSSN.text); 
AddParam(stored_procedure, '@FirstName', edtFirstName.Text); 
AddParam(stored_procedure, '@LastName', edtLastName.Text); 
AddParam(stored_procedure, '@UserRID', GetRIDFromCombo(cbUser)); 
19

은 허용 대답을 :-)있다, 그러나 나는 정의하고 한 줄에 매개 변수를 사용하는 간단하고 쉬운 방법으로 당신을 가리 키도록합니다 :

stored_procedure.Parameters.CreateParameter('SSN',ftString,pdInput,30,edtSSN.text); 

그것은 간단하고 유연 당신 때문에 동일한 라인으로 입력 및 출력 매개 변수를 정의 할 수 있습니다.

function CreateParameter(const Name: WideString; DataType: TDataType; 
    Direction: TParameterDirection; Size: Integer; 
    Value: OleVariant): TParameter; 
+2

을하기 전에 stored_procedure.Parameters.Refresh;를 호출해야합니다. –

+0

그 존재를 몰랐습니다. 공유 해줘서 고마워! – robsoft

+0

Bruce & Rob, 그게 바로 그 아름다움입니다. Delphier에서 많은 것을 배웠고, 내가 아는 것을 다른 사람들과 공유하려고 노력하고 있습니다. :-) –

10

ADO 당신을 위해, 당신은 단지 매개 변수에 대한 새로 고침을 호출하는 데 필요한 매개 변수를 만듭니다 개체 :

SP.Connection := SqlConnection; // must be done before setting procedure name 
sp.ProcedureName := 'MyStoredProc'; 
sp.Parameters.Refresh; // This will create the parameters for you as defined in SQL Server 
sp.Parameters.ParamByName('@SSN'').Value := SSN; // params now exist 

매개 변수의 경우

델파이 도움말에서

출력을 명시 적으로 설정해야합니다.

sp.Parameters.ParamByName('@ReturnValue').Direction := pdInputOutput; 
+1

이것은 훌륭하지만 프로 시저가 연결의 기본 데이터베이스에있는 경우에만 작동합니다. DifferentDatabase.Owner.ProcedureName을 사용할 경우 매개 변수를 파괴하는 ADO 버그가 있습니다. – DiGi

+1

동일한 database.owner 내에서도 .Refresh가 항상 작동하지 않는 것으로 나타났습니다. 나는 그것이 작동하지 않을 때와 작동하지 않을 때 어떤 패턴도 찾지 못했지만, "Parameter '@SearchText'와 같은 오류가 나타나지 않고 오류가 발생하지 않습니다.".ParamByName을 사용할 때 같은 호출이 99.9 %의 시간 동안 작동합니다. 수동으로 매개 변수를 추가하면 문제가 무시됩니다. – Tony

0

이 짧은 내가 아는입니다 :

stored_procedure.Parameters.ParamByName('@SSN').Value := edtSSN.text; 

주, 당신은 stored_procedure.Connection를 할당하고이 나보다 더 나은 해답이 될 것으로 보인다이

관련 문제