Более динамичные параметры генерируют исключение SQLException "необходимо определить скалярную переменную", когда не используются анонимные объекты

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

Зачем?

3 ответа

Решение

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

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 исключение: член CreatedDate типа System.Object не может использоваться в качестве значения параметра.

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

Другие вопросы по тегам