2009-07-21 10 views
8

Ho bisogno di convertire una grande quantità di query SQL in stored procedure. Ho del codice che aggiorna circa 20 o 30 valori contemporaneamente in una procedura Delphi. Posso gestire la creazione di stored procedure per fare una cosa del genere. Il problema è il mio modo per passare parametri per stored procedure è molto ingombrante come questo:Un modo migliore per passare i parametri a un 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); 

Anche io non sono sicuro se che causa una perdita di memoria (è necessario liberare tali oggetti TParameter?)

Qualcuno ha un modo migliore di gestire una grande quantità di parametri? (Non posso usare una nuova libreria. Devo usare ADO e l'SQL che uso è MSSQL) (anche, NON sto usando ADO.net)

risposta

11

Ciò non causa una perdita di memoria. stored_procedure pulirà i suoi parametri. È possibile confermare questo con FastMM aggiungendo quanto segue al .dpr:

ReportMemoryLeaksOnShutdown := True; 

In primo luogo, mi piacerebbe sbarazzarsi del "con" dichiarazione. Può portare a più problemi e codice meno leggibile.

Vorrei creare un metodo di supporto che accetta una stored procedure, un nome di parametro e un valore di parametro, che renderà il codice più gestibile.

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

C'è una risposta :-) accettato, ma voglio puntare a modo più semplice e più facile da definire e utilizzare i parametri con una riga:

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

E 'semplice e flessibile, perché si può definire i parametri di input e output con la stessa linea.

e da Delphi aiuto:

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

Questo sembra essere una risposta migliore del mio. –

+0

Non sapevo che esistesse. Grazie per la condivisione! – robsoft

+0

Grazie Bruce & Rob, questa è la bellezza di SO, ho imparato molte cose per Delphier qui, e sto provando a condividere quello che so con gli altri :-) –

10

ADO creerà i parametri per voi, non vi resta che chiamare Refresh sui parametri oggetto:

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 

ecc

Se alcuni parametri vengono emessi è necessario impostarli esplicitamente:

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

Questo è bello ma funziona solo se la procedura è nel database predefinito della connessione. C'è un bug in ADO che distrugge i parametri se si utilizza DifferentDatabase.Owner.ProcedureName – DiGi

+1

Ho anche scoperto che. Refresh non funziona sempre, anche all'interno dello stesso database.owner. Non ho trovato nessun pattern su quando funziona e quando non lo fa, ma quando non lo capisco e ho riscontrato un errore come "Parametro '@SearchText' non trovato."quando uso .ParamByName. Quella stessa chiamata funziona il 99,9% delle volte. L'aggiunta manuale dei parametri sembra aggirare il problema. – Tony

0

Questa è la più breve so:

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

nota, è necessario assegnare il stored_procedure.Connection e chiamare stored_procedure.Parameters.Refresh; prima di fare questo

Problemi correlati