2011-11-22 13 views
20

(Questo codice sta usando Dapper Dot Net in C#)parametri dinamici Dapper gettano una SQLException "deve definire variabile scalare" quando non si utilizza oggetti anonimi

questo codice funziona:

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

Questo codice genera un 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: Deve dichiarare la variabile scalare "@Priority".

Perché?

risposta

27

implementare il modello con le proprietà, non campi:

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

Dapper esamina le proprietà dell'oggetto per ottenere i parametri, campi ignorando. I tipi anonimi funzionano perché sono implemented with properties.

+1

Interessante; consideriamo i campi per la materializzazione, quindi forse è un po 'incoerente che non permettiamo poi (quelli pubblici, almeno), per la parametrizzazione. Meh ... Hai ragione - è banale da risolvere con l'uso corretto delle proprietà. –

+2

@MarcGravell sembra violare il principio di minima sorpresa. Io voterei per cambiare il comportamento o documentare il requisito. –

1

Ho anche avuto lo stesso problema con il tipo di dati. Quando si effettua una query con oggetto dinamico con una proprietà DateTime, eccezione: il membro CreatedDate di tipo System.Object non può essere utilizzato come valore di parametro.

Ha funzionato quando ho utilizzato un POCO anziché dinamico in seguito.

1

Sebbene questa risposta non riguardi il problema del poster, ho riscontrato un problema simile con una correzione diversa che condividerò qui.

mi definiva in modo non corretto la lista dei parametri come new []{ ... }:

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

cadere il [] risolto il mio problema:

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