Лучший способ передачи параметров в TADOStoredProc (Delphi) - PullRequest
8 голосов
/ 21 июля 2009

Мне нужно преобразовать большое количество запросов SQL в хранимые процедуры. У меня есть код, который обновляет около 20 или 30 значений одновременно в одной процедуре 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)

Ответы [ 4 ]

19 голосов
/ 21 июля 2009

Есть приемлемый ответ :-), но я хочу указать вам на более простой и легкий способ определения и использования параметров в одной строке:

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

Это просто и гибко, потому что вы можете определить входные и выходные параметры одной строкой.

и из справки Delphi:

function CreateParameter(const Name: WideString; DataType: TDataType;
    Direction: TParameterDirection; Size: Integer; 
    Value: OleVariant): TParameter;
11 голосов
/ 21 июля 2009

Это не вызывает утечку памяти. Хранимый_процесс будет очищать свои параметры. Вы можете подтвердить это с помощью FastMM, добавив в свой .dpr следующее:

  ReportMemoryLeaksOnShutdown := True;

Во-первых, я бы избавился от утверждения "с". Это может привести к большему количеству проблем и уменьшению читаемости кода.

Я бы создал вспомогательный метод, который принимает хранимую процедуру, имя параметра и значение параметра, что сделает ваш код более управляемым.

AddParam(stored_procedure, '@SSN', edtSSN.text);
AddParam(stored_procedure, '@FirstName', edtFirstName.Text);
AddParam(stored_procedure, '@LastName', edtLastName.Text);
AddParam(stored_procedure, '@UserRID', GetRIDFromCombo(cbUser));
10 голосов
/ 22 июля 2009

ADO создаст параметры для вас, вам просто нужно вызвать Refresh для объекта параметров:

 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;
0 голосов
/ 15 декабря 2014

Это самое короткое из известных мне:

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

Обратите внимание, вам нужно назначить stored_procedure.Connection и позвонить stored_procedure.Parameters.Refresh;, прежде чем делать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...