(此代码使用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而不是动态时,它工作了。