30

(此代码在 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.SqlException:必须声明标量变量“@Priority”。

为什么?

4

3 回答 3

38

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

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

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

于 2011-11-22T16:53:29.530 回答
2

尽管此答案与发布者的问题无关,但我遇到了类似的问题,但我将在此处分享不同的修复方法。

我错误地将参数列表定义为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 });
于 2016-04-15T14:03:07.800 回答
1

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

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

于 2012-03-01T17:36:06.377 回答