Dapper 动态参数在不使用匿名对象时引发 SQLException "must define scalar variable"



(此代码使用c#中的Dapper Dot Net)

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。必须声明标量变量"@Priority"。

为什么?

用属性实现你的模型,而不是字段:

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

Dapper查看对象的属性以获取参数,忽略字段。匿名类型可以工作,因为它们是用属性实现的。

虽然这个答案与海报上的问题无关,但我有一个类似的问题,我将在这里分享不同的修复方法。

我错误地将参数列表定义为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 });

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

当我使用POCO而不是动态时,它工作了。

相关内容

最新更新