Les paramètres dynamiques Dapper lancent une exception SQLException "doit définir une variable scalaire" lorsque vous n'utilisez pas d'objets anonymes

c# dapper sqlexception

Question

(Ce code utilise Dapper Dot Net en C #)

Ce code fonctionne:

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

Ce code déclenche une exception 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: Doit déclarer la variable scalaire "@Priority".

Pourquoi?

Réponse acceptée

Implémentez votre modèle avec des propriétés, pas des champs:

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

Dapper examine les propriétés de l'objet pour obtenir des paramètres, en ignorant les champs. Les types anonymes fonctionnent car ils sont implémentés avec des propriétés .


Réponse populaire

Bien que cette réponse ne concerne pas le problème de l'affiche, j'ai eu un problème similaire avec un correctif différent que je partagerai ici.

Je ne définissais pas correctement la liste de paramètres comme 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 });

Lâcher le [] résolu mon problème:

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi