次の方法で共有


Dapper の制限事項

Dapper で Microsoft.Data.Sqlite を使用する場合は、いくつかの制限事項に注意する必要があります。

パラメーター

SQLiteのパラメータ名は大文字と小文字を区別します。 SQL で使用するパラメーター名の大文字と小文字が、匿名オブジェクトのプロパティと一致していることを確認してください。 問題 #18861 では、このエクスペリエンスが向上します。

Dapper は、パラメーターで @ プレフィックスを使用することも想定しています。 その他のプレフィックスは機能しません。

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

データ型

Dapper は、SqliteDataReader インデクサーを使用して値を読み取ります。 このインデクサーの戻り値の型はオブジェクトです。つまり、long、double、string、または byte[] の値のみが返されます。 詳細については、データ型を参照してください。 Dapper は、これらと他のプリミティブ型の間のほとんどの変換を処理します。 残念ながら、 DateTimeOffsetGuid、または 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());

こちらも参照ください