Los parámetros dinámicos de Dapper arrojan una SQLException "debe definir una variable escalar" cuando no se utilizan objetos anónimos

c# dapper sqlexception

Pregunta

(Este código usa Dapper Dot Net en C #)

Este código funciona:

var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name";
connection_.Execute(command, new { Name = "myname", Priority = 10 } );

Este código arroja una SqlException:

class MyAccount 
{
    public string Name;
    public int Priority;
}

var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name";
var acct = new MyAccount { Name = "helloworld", Priority = 10 };
connection_.Execute(command, acct);

System.Data.SqlClient.SqlException: debe declarar la variable escalar "@Priority".

¿Por qué?

Respuesta aceptada

Implemente su modelo con propiedades, no campos:

class MyAccount 
{
    public string Name { get; set; }
    public int Priority { get; set; }
}

Dapper mira las propiedades del objeto para obtener parámetros, ignorando los campos. Los tipos anónimos funcionan porque están implementados con propiedades .


Respuesta popular

Aunque esta respuesta no se relaciona con el problema del póster, tuve un problema similar con una solución diferente que compartiré aquí.

Estaba definiendo incorrectamente la lista de parámetros como un new []{ ... } :

var name = "myName";
var priority = 1;
var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name";
connection_.Execute(command, new []{ priority, name });

Dejar caer [] resolvió mi problema:

connection_.Execute(command, new { priority, name });


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é