C# Dapper动态参数抛出一个SQLException“;必须定义标量变量“;不使用匿名对象时

C# Dapper动态参数抛出一个SQLException“;必须定义标量变量“;不使用匿名对象时,c#,sqlexception,dapper,C#,Sqlexception,Dapper,(此代码在C#中使用简洁的点网) 此代码适用于: var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name"; connection_.Execute(command, new { Name = "myname", Priority = 10 } ); 此代码引发SqlException: class MyAccount { public string Name; public i

(此代码在C#中使用简洁的点网)

此代码适用于:

var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name";
connection_.Execute(command, new { Name = "myname", Priority = 10 } );
此代码引发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:必须声明标量变量“@Priority”


为什么?

使用属性而不是字段实现您的模型:

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

Dapper查看对象的属性以获取参数,忽略字段。匿名类型之所以有效,是因为它们是匿名类型。

我也遇到了与数据类型相同的问题。使用具有DateTime属性的动态对象进行查询时,异常:System.object类型的成员CreatedDate不能用作参数值


当我以后使用POCO而不是dynamic时,它就起作用了。

虽然这个答案与海报的问题无关,但我在这里分享的另一个修复程序也有类似的问题

我错误地将参数列表定义为
new[]{…}

var name = "myName";
var priority = 1;
var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name";
connection_.Execute(command, new []{ priority, name });
删除
[]
解决了我的问题:

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

有趣;我们考虑领域的物化,所以可能有点不一致,我们不允许(至少是公共的)参数化。无聊的。。。不过你是对的——通过正确使用属性来解决这个问题是微不足道的。@MarcGravel它似乎违反了最小意外原则。我会投票改变行为或记录需求。确保使用“公共”属性,否则在使用“内部”或“私有”属性时会出现“必须定义标量变量”错误。