8
votes

Un meilleur moyen de passer des paramètres à un TadostoredProc (Delphi)

J'ai besoin de convertir une grande quantité de requêtes SQL en procédures stockées. J'ai un certain code qui met à jour environ 20 ou 30 valeurs à la fois dans une procédure Delphi. Je peux gérer la création d'une procédure stockée pour faire une telle chose. Le problème est que ma façon de passer des paramètres aux procédures stockées est très encombrante comme ceci:

    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);


0 commentaires

4 Réponses :


11
votes

Cela ne provoque pas de fuite de mémoire. Stored_ProcoDure va nettoyer ses paramètres. Vous pouvez confirmer cela avec FastMM en ajoutant ce qui suit à votre fichier .dPR: xxx pré>

premier, je me débarrasserais de la déclaration "avec". Cela peut conduire à plus de problèmes et de code moins lisible. P>

Je créerais une méthode d'assistance qui accepte une procédure stockée, un nom de paramètre et une valeur de paramètre, qui rendra votre code plus gérable. P >

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


0 commentaires

20
votes

Il y a une réponse acceptée :-), mais je veux vous diriger sur un moyen plus simple et plus facile de définir et d'utiliser les paramètres avec une ligne: xxx

C'est simple et flexible, car vous Peut définir les paramètres d'entrée et de sortie avec la même ligne.

et de Delphi Aide: xxx


4 commentaires

Cela semble être une meilleure réponse que la mienne.


Je ne savais pas que cela existait. Merci d'avoir partagé!


Merci Bruce & Rob, c'est la beauté de Donc, j'ai appris beaucoup de choses pour Delphier ici et essayant de partager ce que je sais avec les autres :-)


C'est assez pratique, même si je préfère toujours le premier moyen, car il est plus simple d'une grande quantité de paramètres d'entrée uniquement



11
votes

ADO créera les paramètres pour vous, il vous suffira de vous rafraîchir sur l'objet Paramètres: xxx pré>

etc p>

Si des paramètres sont sortis, vous aurez besoin de Définissez-les explicitement: P>

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


3 commentaires

C'est bien, mais cela ne fonctionne que si la procédure est dans la base de données par défaut de la connexion. Il y a un bogue dans ADO qui détruisent des paramètres si vous utilisez Diffiffraabase.owner.ProcoDurename


J'ai également constaté que .Refresh ne fonctionne pas toujours, même dans la même base de données.OWER. Je n'ai trouvé aucun modèle à quand ça marche et quand ce n'est pas le cas, mais quand je ne reçois pas, je reçois et error comme "Paramètre '@SearchText" non trouvé ". quand j'utilise .parambyname. Le même appel fonctionne 99,9% du temps. L'ajout de paramètres manuellement semble contourner le problème.


Merci beaucoup. J'avais des problèmes avec des paramètres de type Tdate et TdateTime, car sp.parameters.refresh crée des paramètres avec le type de données de WELString au lieu de Tdate.



0
votes

Ceci est le plus court que je connais: xxx

Remarque, vous devez attribuer le stocké_procedure.connection et appelez stocké_procedure.parameters.refresh; < / code> avant de faire cela


0 commentaires