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());
関連項目
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET