Подтвердить что ты не робот

Динамические параметры Dapper вызывают SQLException "должен определять скалярную переменную", если не использовать анонимные объекты

(Этот код использует 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".

Почему?

4b9b3361

Ответ 1

Реализовать свою модель со свойствами, а не полями:

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

Dapper рассматривает свойства объекта для получения параметров, игнорируя поля. Анонимные типы работают, потому что они реализованы со свойствами.

Ответ 2

У меня также была проблема с типом данных. При создании запроса с динамическим объектом, имеющим свойство DateTime, исключение: член CreatedDate типа System.Object не может использоваться как значение параметра.

Он работал, когда я использовал POCO вместо динамического позже.

Ответ 3

Хотя этот ответ не относится к проблеме с плакатом, у меня была аналогичная проблема с другим исправлением, которое я расскажу здесь.

Я неправильно определял список параметров как 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 });