Exécuter la procédure stockée avec les paramètres dans Dapper

c# dapper data-access-layer sql stored-procedures

Question

J'utilise Dapper (merci Sam , excellent projet.) Un micro ORM avec un DAL et, pour une raison quelconque, je ne suis pas capable d'exécuter des procédures stockées avec des paramètres d'entrée.

Dans un exemple de service, j'ai le code suivant:

public void GetSomething(int somethingId)
{
    IRepository<Something, SomethingEnum> repository = UnitOfWork.GetRepository<Something, SomethingEnum>();

    var param = new DynamicParameters();
    param.Add("@somethingId", dbType: DbType.Int32, value:somethingId, direction: ParameterDirection.Input);

    var result = repository.Exec<Something>(SomethingEnum.spMyStoredProcedure, param);

    ...

}

Lorsque l'exécution de la procédure stockée est déclenchée, une exception SqlException est émise, indiquant que je dois fournir l'élément 'quelquechose'

La procédure ou la fonction 'spMyStoredProcedure' attend le paramètre '@somethingId', qui n'a pas été fourni.

Mon DAL est similaire sur ce projet github de Pencroff.

Est-ce que j'ai râté quelque chose?

Mise à jour: je passe actuellement le commandType via le SomethingEnum:

 public class SomethingEnum : EnumBase<SomethingEnum, string>
 {
    public static readonly SomethingEnum spMyStoredProcedure = new SomethingEnum("spMyStoredProcedure", "[dbo].[spMyStoredProcedure]", CommandType.StoredProcedure);

    public SomethingEnum(string Name, string EnumValue, CommandType? cmdType): base(Name, EnumValue, cmdType)
    {
    }
}

Réponse acceptée

Vous devez lui indiquer le type de commande: assurez-vous qu’il existe un type de commandType: CommandType.StoredProcedure dans l’appel dapper. Sinon, il suffit d’exécuter la commande text :

spMyStoredProcedure

(avec quelques paramètres inutilisés dans le contexte ambiant). Il s'agit d'une norme TSQL, et tente d'appeler spMyStoredProcedure sans transmettre de paramètres , comme si vous spMyStoredProcedure dans SSMS et appuyez sur f5 .

De plus, si vos paramètres sont fixes, je vous suggère d’utiliser simplement:

var param = new { somethingId };

ou même simplement l'inclure complètement:

var result = repository.Exec<Something>(SomethingEnum.spMyStoredProcedure,
    new { somethingId }, commandType: CommandType.StoredProcedure);

(Remarque: si votre méthode Exec<T> ne gère que les procédures stockées, vous pouvez déplacer le type de commandType interne vers la méthode - ou en faire un paramètre facultatif qui utilise par défaut CommandType.StoredProcedure )


Réponse populaire

var queryParameters = new DynamicParameters();
queryParameters.Add("@parameter1", valueOfparameter1);
queryParameters.Add("@parameter2", valueOfparameter2);

await db.QueryAsync<YourReturnType>(
    "{NameOfStoredProcedure}",
    queryParameters,
    commandType: CommandType.StoredProcedure)


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi