Freigeben über


Dapper-Einschränkungen

Es gibt einige Einschränkungen, die Sie bei der Verwendung von Microsoft.Data.Sqlite mit Dapper beachten sollten.

Die Parameter

SQLite-Parameternamen sind case-sensitive. Stellen Sie sicher, dass die in SQL verwendeten Parameternamen mit der Schreibweise der Eigenschaften des anonymen Objekts übereinstimmen. Ausgabe Nr. 18861 wird diese Erfahrung verbessern.

Dapper erwartet auch, dass Parameter das @ Präfix verwenden. Andere Präfixe funktionieren nicht.

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

Datentypen

Dapper liest Werte mithilfe des SqliteDataReader-Indexers vor. Der Rückgabetyp dieses Indexers ist objekt, was bedeutet, dass er nur lange, doppelte, Zeichenfolgen- oder Byte[]-Werte zurückgibt. Weitere Informationen finden Sie unter Datentypen. Dapper behandelt die meisten Konvertierungen zwischen diesen und anderen Grundtypen. Leider werden DateTimeOffset, Guid und TimeSpan nicht verwendet. Erstellen Sie Typhandler, wenn Sie diese Typen in Ihren Ergebnissen verwenden möchten.

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);
}

Vergessen Sie nicht, die Typhandler vor der Abfrage hinzuzufügen.

SqlMapper.AddTypeHandler(new DateTimeOffsetHandler());
SqlMapper.AddTypeHandler(new GuidHandler());
SqlMapper.AddTypeHandler(new TimeSpanHandler());

Siehe auch