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 处理这些基元类型和其他基元类型之间的大多数转换。 遗憾的是,它不处理 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());