Более динамичные параметры генерируют исключение 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 вместо динамического позже.