Поделиться через


Ограничения Dapper

При использовании Microsoft.Data.Sqlite с Dapper следует учитывать несколько ограничений.

Параметры

Имена параметров SQLite чувствительны к регистру. Убедитесь, что имена параметров, используемые в SQL, соответствуют регистру свойств анонимного объекта. Проблема No 18861 улучшит этот интерфейс.

Dapper также ожидает, что параметры будут использовать @ префикс. Другие префиксы не будут работать.

var result = connection.ExecuteScalar(
    "SELECT @Value",
    new { Value = 1 });

Типы данных

Dapper считывает значения с помощью индексатора SqliteDataReader. Возвращаемый тип этого индексатора — объект, который означает, что он будет возвращать только длинные, двойные, строковые или байтовые[] значения. Дополнительные сведения см. в разделе Типы данных. 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());

См. также