I parametri dinamici di Dapper generano un SQLException "deve definire una variabile scalare" quando non si utilizzano oggetti anonimi

c# dapper sqlexception

Domanda

(Questo codice utilizza Dapper Dot Net in C #)

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 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: deve dichiarare la variabile scalare "@Priority".

Perché?

Risposta accettata

Implementa il tuo modello con proprietà, non campi:

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

Dapper guarda le proprietà dell'oggetto per ottenere parametri, ignorando i campi. I tipi anonimi funzionano perché sono implementati con le proprietà .


Risposta popolare

Anche se questa risposta non si riferisce al problema del poster, ho avuto un problema simile con una correzione diversa che condividerò qui.

Definivo erroneamente 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 });

Lasciando [] risolto il mio problema:

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché