L'ajout de paramètres à une requête avec Informix et Dapper échoue avec une exception de syntaxe

asp.net-mvc c# dapper informix

Question

Je tente d'utiliser des requêtes paramétrées avec Informix sur ODBC, mais toute tentative d'ajout de paramètres échoue avec cette exception:

$exception {"ERROR [42000] [Informix .NET provider][Informix]A syntax error has occurred."} System.Exception {IBM.Data.Informix.IfxException}

Voici le code qui échoue:

List<ItemAttribute> items = con.Query<ItemAttribute>("select * from oe_cnvwrk where cwr_genero = @cwr_genero", new{cwr_genero = cwr_genero}).ToList();

L'utiliser sans paramètres, comme cet exemple, fonctionne parfaitement, mais ouvre l'application jusqu'aux attaques par injection:

ItemHeader itemHeader = con.Query<ItemHeader>("select * from oe_cnvhdr where hdr_control_id = " + hdr_control_id).Single();

J'ai été en mesure de trouver une question précédemment répertoriée sur ce même problème ici, mais il n'a jamais été répondu. J'espère que quelqu'un aura une idée de la façon de gérer le problème: Dapper n'ajoute pas de paramètres

Avez-vous des idées pour résoudre ce problème ou existe-t-il une autre méthode pour gérer le paramétrage avec Dapper?

Réponse d'expert

Pas encore publié sur NuGet, mais le code source prend désormais en charge les paramètres pseudo-positionnels. Celles-ci sont implémentées par reconnaissance de forme, telle que ?abc? dans votre texte correspond au paramètre nommé du membre abc , mais en utilisant positional ? syntaxe. Donc, si vous émettez:

List<ItemAttribute> items = con.Query<ItemAttribute>(
    "select * from oe_cnvwrk where cwr_genero = ?cwr_genero?",
    new{cwr_genero = cwr_genero}).ToList();

cela devrait fonctionner; la requête réelle exécutée est:

select * from oe_cnvwrk where cwr_genero = ?

où le paramètre ajouté est celui du membre marqué cwr_genero . Cela permet au membre d'être résolu correctement. Le spécial ?foo? pattern est utilisé comme indicateur pour passer aux paramètres de position.

Notez que les paramètres individuels ne peuvent être référencés qu'une seule fois par requête. ce qui suit ne fonctionnera pas :

select * from sometable where foo = ?x? or bar = ?x?


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