Reputation: 63835
I am needing to convert a large amount of SQL queries into stored procedures. I have some code that updates about 20 or 30 values at one time in one Delphi procedure. I can handle creating a stored procedures to do such a thing. The problem is my way to pass parameters to stored procedures is very bulky like this:
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);
I also am not sure if that causes a memory leak(is it necessary to free such TParameter objects?)
Anyone have a better way of handling a large amount of parameters? (I can not use a new library. I must use ADO, and the SQL I use is MSSQL) (also, I'm NOT using ADO.net)
Upvotes: 8
Views: 17720
Reputation: 2150
This is the shortest I know:
stored_procedure.Parameters.ParamByName('@SSN').Value := edtSSN.text;
Note, you need to assign the stored_procedure.Connection
and call stored_procedure.Parameters.Refresh;
before doing this
Upvotes: 0
Reputation: 11050
There's an accepted answer :-), but I want to point you to simpler and easier way to define and use the parameters with one line :
stored_procedure.Parameters.CreateParameter('SSN',ftString,pdInput,30,edtSSN.text);
It's simple and flexible, because you can define the input and output parameters with same line.
and from Delphi help:
function CreateParameter(const Name: WideString; DataType: TDataType;
Direction: TParameterDirection; Size: Integer;
Value: OleVariant): TParameter;
Upvotes: 20
Reputation: 5975
ADO will create the parameters for you, you just need to call Refresh on the parameters object:
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
etc
If any parameters are output you will need to set them explicitly:
sp.Parameters.ParamByName('@ReturnValue').Direction := pdInputOutput;
Upvotes: 11
Reputation: 15334
This doesn't cause a memory leak. stored_procedure will clean up its parameters. You can confirm this with FastMM by adding the following to your .dpr:
ReportMemoryLeaksOnShutdown := True;
First, I'd get rid of the "with" statement. It can lead to more problems and less readable code.
I'd create a helper method that accepts a stored procedure, a parameter name and a parameter value, which will make your code more manageable.
AddParam(stored_procedure, '@SSN', edtSSN.text);
AddParam(stored_procedure, '@FirstName', edtFirstName.Text);
AddParam(stored_procedure, '@LastName', edtLastName.Text);
AddParam(stored_procedure, '@UserRID', GetRIDFromCombo(cbUser));
Upvotes: 11