Ограничения Dapper
При использовании Microsoft.Data.SQLite с Dapper необходимо учитывать ряд ограничений.
Параметры
В именах параметров SQLite учитывается регистр букв. Убедитесь, что имена параметров, используемые в SQL, соответствуют регистру свойств анонимного объекта. Обратите внимание на проблему #18861, чтобы упростить себе работу.
Dapper также ожидает от параметров использования префикса @
. Другие префиксы работать не будут.
var result = connection.ExecuteScalar(
"SELECT @Value",
new { Value = 1 });
Типы данных
Dapper считывает значения с помощью индексатора SqliteDataReader. Тип возвращаемого значения этого индексатора — object, то есть он будет возвращать только значения long, double, string или byte[]. Дополнительные сведения см. в разделе Типы данных. Dapper обрабатывает большинство преобразований между этими и прочими примитивными типами. К сожалению, он не может обрабатывать DateTimeOffset
, Guid
или TimeSpan
. Создавайте обработчики типов, если эти типы нужно включать в результаты.
abstract class SqliteTypeHandler<T> : SqlMapper.TypeHandler<T>
{
// Parameters are converted by Microsoft.Data.Sqlite
public override void SetValue(IDbDataParameter parameter, T? value)
=> parameter.Value = value;
}
class DateTimeOffsetHandler : SqliteTypeHandler<DateTimeOffset>
{
public override DateTimeOffset Parse(object value)
=> DateTimeOffset.Parse((string)value);
}
class GuidHandler : SqliteTypeHandler<Guid>
{
public override Guid Parse(object value)
=> Guid.Parse((string)value);
}
class TimeSpanHandler : SqliteTypeHandler<TimeSpan>
{
public override TimeSpan Parse(object value)
=> TimeSpan.Parse((string)value);
}
Не забудьте добавить обработчики типов перед выполнением запроса.
SqlMapper.AddTypeHandler(new DateTimeOffsetHandler());
SqlMapper.AddTypeHandler(new GuidHandler());
SqlMapper.AddTypeHandler(new TimeSpanHandler());