【问题标题】:Reading incorrect values from Excel using OleDbDataReader in C#.NET在 C#.NET 中使用 OleDbDataReader 从 Excel 中读取不正确的值
【发布时间】:2013-03-26 15:25:14
【问题描述】:

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

"System.ArgumentException: 'System.DBNull' 类型的对象不能 转换为类型 'System.Double'"

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

我读过的一篇文章建议在连接字符串中使用IMEX=1 将混合值作为文本读取。然而,这并没有奏效。当我添加IMEX=1 时,我收到了"Could not find installable ISAM" 消息。

提前感谢您的帮助。

【问题讨论】:

    标签: c# visual-studio-2010 excel automation nunit


    【解决方案1】:

    除了在连接字符串中设置 IMEX 模式外,您还可以尝试调整一些 Jet 引擎的注册表设置。

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

    将此更改为 Text 以使其成为混合类型(例如文本和数字)的默认导入

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

    将此更改为 0 以强制引擎在选择数据类型之前扫描列中的所有值(否则它只会扫描前 8 行)。

    关于“找不到可安装的 ISAM”错误。 可能是您的 ISAM 驱动程序的路径无效(请参阅 here),但您的连接字符串更有可能出现错误。有关正确示例,请参阅 herehere

    【讨论】:

    • 谢谢!这实际上是我的连接字符串。我添加了 IMEX=1,但后来我不得不将所有扩展属性括在引号中,因为不止一个。成功了。
    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多