3

これに関して問題を提起する必要があるかどうかわからないので、最初にこれに対する簡単な回避策を誰かが知っているかどうか尋ねようと思いました. MS Access 2003 (Jet.4.0) と組み合わせて使用​​する場合、OleDbConnection で Dapper を使用しようとするとエラーが発生します (データベースの選択ではありません!)

以下のテスト コードを実行すると、「OleDbException : 基準式のデータ型が一致しません」という例外が発生します。

var count = 0;

using (var conn = new OleDbConnection(connString)) {

    conn.Open();
    var qry = conn.Query<TestTable>("select * from testtable where CreatedOn <= @CreatedOn;", new { CreatedOn = DateTime.Now });
    count = qry.Count();
}

OleDb の日付に関する過去の経験から、DbType を Date に設定すると、内部で OleDbType プロパティの値が OleDbType.Date ではなく OleDbTimeStamp に変更されると思います。これは Dapper のせいではないことは理解していますが、OleDbParameter クラスで内部的にリンクする奇妙な方法と見なされる可能性があるのは

他の ORM、未加工の ADO、または独自のファクトリ オブジェクトを使用してこれに対処する場合、コマンドを実行する直前にコマンド オブジェクトをクリーンアップし、OleDbType を Date に変更します。

コマンドオブジェクトが内部にあるように見えるため、私が見る限り、これはDapperでは不可能です。残念ながら、私は動的生成のことを学ぶ時間がなかったので、簡単なことを見落としていたり​​、単に問題を提起するのではなく、修正を提案して貢献したりする可能性があります。

何かご意見は?

リー

4

1 に答える 1

4

それは古いスレッドですが、私は同じ問題を抱えていました.Accessはミリ秒のDateTimeが好きではないので、次のような拡張メソッドを追加する必要があります:

public static DateTime Floor(this DateTime date, TimeSpan span)
{
    long ticks = date.Ticks / span.Ticks;
    return new DateTime(ticks * span.Ticks, date.Kind);
}

パラメータを渡すときに使用します。

var qry = conn.Query<TestTable>("select * from testtable where CreatedOn <= @CreatedOn;", new { CreatedOn = DateTime.Now.Floor(TimeSpan.FromSeconds(1)) });

残念ながら、現在の Dapper バージョン (1.42) では、基本型のカスタム TypeHandler を追加できません ( #206を参照)。

Dapper を変更できる場合 (DLL ではなく cs ファイルを使用)、このプル リクエストFloorをマージすると、各パラメーターで使用する必要がなくなります。

public class DateTimeTypeHandler : SqlMapper.TypeHandler<DateTime>
{
    public override DateTime Parse(object value)
    {
        if (value == null || value is DBNull) 
        { 
            return default(DateTime); 
        }
        return (DateTime)value;
    }

    public override void SetValue(IDbDataParameter parameter, DateTime value)
    {
        parameter.DbType = DbType.DateTime;
        parameter.Value = value.Floor(TimeSpan.FromSeconds(1));
    }
}

SqlMapper.AddTypeHandler<DateTime>(new DateTimeTypeHandler());
于 2015-08-27T08:50:16.320 に答える