ms-access - Dapper 和 System.Data.OleDb DbType.Date 抛出 'OleDbException : Data type mismatch in criteria expression'

标签 ms-access oledbconnection dapper

不确定我是否应该提出有关此问题的问题,因此我想先询问是否有人知道此问题的简单解决方法。当我尝试将 Dapper 与 OleDbConnection 与 MS Access 2003 (Jet.4.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 属性的值更改为 OleDbTimeStamp 而不是 OleDbType.Date。我知道这不是因为 Dapper,而是在 OleDbParameter 类中“可能”被认为是一种奇怪的内部链接方式

当使用其他 ORM、原始 ADO 或我自己的工厂对象处理此问题时,我会在运行命令之前清理命令对象并将 OleDbType 更改为 Date。

据我所知,这对于 Dapper 来说是不可能的,因为命令对象似乎是内部的。不幸的是,我没有时间学习动态生成的东西,所以我可能会错过一些简单的东西,或者我可能会建议修复并做出贡献,而不是简单地提出问题。

有什么想法吗?

最佳答案

这是一个旧线程,但我遇到了同样的问题: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(使用cs文件而不是DLL)合并这个pull request然后您不必在每个参数上使用 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());

关于ms-access - Dapper 和 System.Data.OleDb DbType.Date 抛出 'OleDbException : Data type mismatch in criteria expression',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6926766/

相关文章:

c# - ADO.NET 获取 OleDbSchemaTable

c# - Dapper QueryAsync 首次阻塞 UI 查询(针对 Oracle 服务器)?

dapper - 不要使用 dapper 扩展更新 Update 方法上的某个属性

c# - 禁用/刷新 OleDbConnection 缓存

.net - 如何捕获特定的 OleDbException?

c# - 使用 Dapper ORM 持久化复杂对象

c# - ADOX 多步 OLE DB 操作产生的错误

java - 如何使用 Java 将系统时间插入到 Ms Access 中?

c# - 继承问题 - 从 Access 数据库文件和 SQL Express 中检索数据

sql-server - Access 数据库 - 链接到 SQL Server 和 Oracle