La adición de parámetros a una consulta con Informix y Dapper falla con la excepción de sintaxis

asp.net-mvc c# dapper informix

Pregunta

Estoy intentando usar consultas parametrizadas con Informix a través de ODBC, pero cualquier intento de agregar parámetros falla con esta excepción:

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

Aquí está el código que falla:

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

Usarlo sin parámetros, como este ejemplo, funciona sin problemas, pero abre la aplicación hasta los ataques de inyección:

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

Pude encontrar aquí una pregunta sobre este mismo tema, pero nunca fue respondida. Espero que alguien tenga una idea de cómo manejar el problema: Dapper no agrega parámetros

¿Alguna idea es una forma de resolver esto, o hay un método diferente para manejar la parametrización con Dapper que podría funcionar?

Respuesta experta

Todavía no se lanzó a NuGet, pero el código fuente ahora contiene soporte para parámetros pseudoposicionales. Estos se implementan mediante el reconocimiento de patrones, de modo que ?abc? en su texto se asigna al parámetro nombrado desde el miembro abc , pero usando posicional ? sintaxis. Entonces si publicas:

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

deberia de funcionar; la consulta real ejecutada es:

select * from oe_cnvwrk where cwr_genero = ?

donde el parámetro agregado es el del miembro marcado cwr_genero . Esto permite que el miembro se resuelva correctamente. El especial ?foo? patrón se utiliza como el indicador para cambiar a los parámetros posicionales.

Tenga en cuenta que los parámetros individuales solo se pueden referenciar una vez por consulta; lo siguiente no funcionará:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué