我正在使用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>
答案 0 :(得分:0)
看起来这实际上是类型提供程序中的一个错误,并且已在最新版本中修复。从完全有效的excel文件返回数据时不应该抛出异常,它现在返回null
。