读取空单元格时,F#Excel类型提供程序抛出System.InvalidCastException

时间:2014-09-08 10:38:12

标签: f# type-providers

我正在使用F#Excel Type Provider。我从文档中获取的小样本代码工作正常,直到我有一个空单元格。

let valueA = row.ColumnA

然后抛出System.InvalidCastException

  

发生了类型为“System.InvalidCastException”的未处理异常   在sample.exe中

     

其他信息:无法转换'System.DBNull'类型的对象   输入'System.String'。

我已使用此代码修复此问题:

let mutable valueA = Unchecked.defaultof<string>
    try
        valueA <- row.ColumnA
    with ex -> 
        valueA <- String.Empty

这不是很好的代码。至少我想创建一个这样的函数,但是这会引发相同的InvalidCastException

let getString (value : Object) =  
     match value.GetType() = typeof<String> with
        | true -> value.ToString()
        | false -> String.Empty     

let valueA = getString row.ColumnA

编辑:似乎是F#的新手,我误解了发生了什么,Excel Type Provider没有返回DbNull,它实际上是在抛出异常。所以这确实解决了这个问题:

let getString func =  
     try
        func()
     with ex -> 
        String.Empty
let valueA = getString (fun() -> row.ColumnA)

我想现在我的问题是类型提供程序不应该重新调整选项类型,以便它可以处理缺失值而不抛出异常吗?或者我仍然缺少一些东西,还有另一种更优雅的方法来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

看起来这实际上是类型提供程序中的一个错误,并且已在最新版本中修复。从完全有效的excel文件返回数据时不应该抛出异常,它现在返回null