2011-11-22 16 views
20

(Este código se utiliza apuesto de la red del punto en C#)parámetros dinámicos Dapper lanzan una excepción de SQL "debe definir variable escalar" cuando no utilice objetos anónimos

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 produce 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

27

implementar su modelo con propiedades, y no los campos:

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

Dapper se ve en la propiedades del objeto para obtener parámetros, haciendo caso omiso de los campos. Los tipos anónimos funcionan porque son implemented with properties.

+1

interesante; consideramos campos para la materialización, por lo que tal vez sea un poco inconsistente que no permitamos entonces (públicos, al menos), para la parametrización. Meh ... Tienes razón, es trivial de resolver por el uso correcto de las propiedades. –

+2

@MarcGravell parece violar el principio de menor sorpresa. Yo votaría para cambiar el comportamiento o documentar el requisito. –

1

También tengo un problema con el tipo de datos. Cuando realiza una consulta con un objeto dinámico que tiene una propiedad DateTime, excepción: el miembro CreatedDate de tipo System.Object no se puede usar como un valor de parámetro.

Funcionó cuando usé un POCO en lugar de dinámico más tarde.

1

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 de forma incorrecta la lista de parámetros como 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 el [] resuelto mi problema:

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