DapperとSystem.Data.OleDb DbType.Date throw '' OleDbException:データ型が一致しません '

dapper ms-access oledbconnection

質問

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

以下のテストコードを実行すると例外が発生します: '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.Dateの代わりにOleDbTypeプロパティの値をOleDbTimeStampに内部的に変更することが考えられます。私はこれがDapperのせいではないことを理解していますが、OleDbParameterクラスで内部的にリンクするのは奇妙な方法と考えられます

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

コマンドオブジェクトが内部にあるように見える限り、これはDapperでは不可能です。残念ながら私はダイナミックな世代のものを学ぶ時間がなかったので、単純なものを見逃す可能性があります。あるいは単に問題を提起するのではなく修正を提案して貢献するかもしれません。

何かご意見は?

リー

受け入れられた回答

それは古いスレッドですが、私は同じ問題がありました。アクセスは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(csファイルで、DLLではなく)を変更することができ、このプル要求をマージして、各パラメータで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());


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ