我有一些.NET代码,它从ODBC驱动程序中读取数据(驱动程序基于DSN字符串选择(带有用户名和密码)),读取表中的几个字段,其中一个字段是DateTime字段。该代码在使用SQL Server数据库/ODBC驱动程序时100%正常工作,并且在大多数情况下使用MS Access数据库也能正常工作。但是,有时候我会在特定行上收到“列2(DateTimeColumn)的无效日期时间格式”异常,即使我没有直接访问该列(例如,即使我只是调用)。
因此,似乎存在某种舍入误差,从Excel对日期时间的计算到Access驱动程序的日期时间计算中涉及到了这种误差。
由于一些数据是由创建自己数据库的用户提供的,我将无法使用我的代码在他们的数据库上运行UPDATE查询。一个潜在的仅适用于Access的解决方法是在我的SQL语句中调用CDate(CStr(DateTimeColumn)),但这对于SQL Server或其他数据库不起作用。
我只使用32位MS Access驱动程序进行了测试(我没有64位驱动程序来测试它们),该驱动程序可与.mdb文件和.accdb文件一起使用,无论数据是在.mdb文件还是.accdb文件中,问题都会发生。
编辑:
以后参考,引起异常的Access数据库中的值为<0x40E4277FFFFFFFF8>,在十进制中为
41275.9999999999417923390865326
还可能感兴趣的是,虽然使用OdbcConnection读取该行时此值会导致错误,但使用OleDbConnection读取相同行却没有抛出异常。
reader.IsDBNull(someOtherColumn)
我仍然遇到异常。
这似乎主要发生在访问数据库已经填充了从Excel中计算的日期时间数据时(例如添加1/24到日期时间以获取下一个小时)。
如果我运行以下查询,则异常会消失:
UPDATE MyTable Set DateTimeColumn = CDate(CStr(DateTimeColumn))
因此,似乎存在某种舍入误差,从Excel对日期时间的计算到Access驱动程序的日期时间计算中涉及到了这种误差。
由于一些数据是由创建自己数据库的用户提供的,我将无法使用我的代码在他们的数据库上运行UPDATE查询。一个潜在的仅适用于Access的解决方法是在我的SQL语句中调用CDate(CStr(DateTimeColumn)),但这对于SQL Server或其他数据库不起作用。
我只使用32位MS Access驱动程序进行了测试(我没有64位驱动程序来测试它们),该驱动程序可与.mdb文件和.accdb文件一起使用,无论数据是在.mdb文件还是.accdb文件中,问题都会发生。
编辑:
以后参考,引起异常的Access数据库中的值为<0x40E4277FFFFFFFF8>,在十进制中为
41275.9999999999417923390865326
还可能感兴趣的是,虽然使用OdbcConnection读取该行时此值会导致错误,但使用OleDbConnection读取相同行却没有抛出异常。