Dapper 限制

使用带有 Dapper 的 Microsoft.Data.Sqlite 时,需要注意几个限制。

参数

SQLite 参数名称区分大小写。 确保 SQL 中使用的参数名称与匿名对象属性的大小写匹配。 问题 #18861 将改进此体验。

Dapper 还要求参数使用 @ 前缀。 其他前缀不起作用。

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

数据类型

Dapper 使用 SqliteDataReader 索引器读取值。 此索引器的返回类型是 object,这意味着它将只返回 long、double、string 或 byte[] 值。 有关详细信息,请参阅数据类型。 Dapper 处理这些基元类型和其他基元类型之间的大多数转换。 遗憾的是,它不处理 DateTimeOffsetGuidTimeSpan。 如果希望在结果中使用这些类型,请创建类型处理程序。

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());

请参阅