在Excel中使用OleDbDataReader在C#.NET中读取不正确的值

我使用NUnit(这是在Visual Studio 2010中)运行一些使用C#.NET编写的testing用例。 我正在使用的方法从另一个开发团队向我提供的Excel .xls(2003)文件中读取用户和地址数据。 当我在不改变Excel文件的情况下运行testing时,一切正常。 如果我更改Excel文件中的某些值,例如名字或姓氏或街道地址,它仍然有效。 但是,如果我更改了邮政编码字段,testing失败,我得到一个错误,说:

“System.ArgumentException:无法将types为”System.DBNull“的对象转换为types”System.Double“”

即使input完全相同的值,也会发生这种情况。 换句话说,如果现有的邮政编码值是“ 11111 ”,而我根本不修改这个文件,那么testing在我运行时就起作用了。 但是,如果我修改该字段并重新input“ 11111 ”,则读者将其视为NULL值并引发上述错误。 在电子表格中的其他行中 – 我没有修改过 – 这个值返回为“ 11111.0d ”,一切正常,所以看起来读者正在读取这些值为Double(我不确定为什么)。 但是如果我自己input价值,它不会这样读。

我读过的一篇文章build议在连接string中使用IMEX=1来将混合值作为文本读取。 但是,这不起作用。 当我添加IMEX=1 ,我收到了"Could not find installable ISAM"消息。

在此先感谢您的帮助。

除了在连接string中设置IMEX模式之外,还可以尝试调整一些Jet引擎的registry设置。

例如,HKEY_LOCAL_MACHINE / Software / Microsoft / Jet / [您的版本] / Engines / Excel / ImportMixedTypes

将其更改为“文本”以使混合types的默认导入(例如文本和数字)

HKEY_LOCAL_MACHINE / Software / Microsoft / Jet / [您的版本] / Engines / Excel / TypeGuessRows

将其更改为0以强制引擎在select数据types之前扫描列中的所有值(否则只扫描前8行)。

关于“无法find可安装的ISAM”错误。 这可能是您的ISAM驱动程序的path无效(请参阅此处 ),但更可能是您的连接string有错误。 看到这里和这里一些正确的例子。