使用 Microsoft.Data.Sqlite 搭配 Dapper 時,您應該注意一些限制。
參數
SQLite 參數名稱會區分大小寫。 請確定 SQL 中使用的參數名稱符合匿名物件屬性的案例。 問題 #18861 可改善此體驗。
Dapper 也預期參數會使用 @
前置詞。 其他前綴將無效。
var result = connection.ExecuteScalar(
"SELECT @Value",
new { Value = 1 });
數據類型
Dapper 會使用 SqliteDataReader 索引器讀取值。 這個索引器傳回型別是 物件,這表示它只會傳回 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());