Cette requête fonctionne; c'est-à-dire qu'il renvoie les résultats attendus:
var r = sql.Query<T>("select * from TableName where Name = '" + name + "'");
mais, si l'une des valeurs 'names' contient une apostrophie (ce qui est vrai), alors une exception est levée '{"Syntaxe incorrecte près de' Resources '. - pour tenter de résoudre ce problème , ma requête ne renvoie plus aucun résultat; mais ça devrait.
J'ai tenté de modifier le code de plusieurs manières, mais aucun résultat n'est renvoyé avec l'une des modifications suivantes:
var r = sql.Query<T>("select * from TableName where Name = '@name'", new { name });
ou
var args = new DynamicParameters(name);
var r = sql.Query<T>("select * from TableName where Name = '@name'", args);
ou
var args = new DynamicParameters(); args.AddDynamicParams(new { name });
var r = sql.Query<T>("select * from TableName where Name = '@name'", args);
ou
var args = new DynamicParameters(); args.Add("@name", name);
var r = sql.Query<T>("select * from TableName where Name = '@name'", args);
C'est probablement quelque chose de trivial que je n'ai tout simplement pas encore compris le concept pour ... mais je suis sur le point d'avoir passé trop de temps à essayer de comprendre - d'où la question.
Utiliser un paramètre est la bonne façon de procéder. Vous ne voulez absolument pas mettre la valeur dans la requête elle-même, comme vous l'avez fait dans votre premier extrait. Cependant, vous avez mis le @name
entre guillemets, ce qui signifie qu'il est traité comme un littéral de chaîne ... il recherche une valeur de nom exactement @name
plutôt que la valeur du paramètre @name
. Tu veux:
var r = sql.Query<T>("select * from TableName where Name = @name", new { name });
(C'est probablement la manière la plus simple de transmettre les paramètres, même si les autres approches devraient également fonctionner.)
Maintenant, je n'ai pas utilisé Dapper moi-même, mais c'est ce à quoi je m'attendais ...