Динамические параметры 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".
Почему?
Ответы
Ответ 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 });