次の方法で共有


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 によって処理されます。 ただし、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());

関連項目