我是 F# 的新手,并尝试先深入了解,然后再进行更正式的介绍。我有以下代码:
type Person =
{
Id: int
Name: string
}
let GetPeople() =
//seq {
use conn = new SQLiteConnection(connectionString)
use cmd = new SQLiteCommand(sql, conn)
cmd.CommandType <- CommandType.Text
conn.Open()
use reader = cmd.ExecuteReader()
let mutable x = {Id = 1; Name = "Mary"; }
while reader.Read() do
let y = 0
// breakpoint here
x <- {
Id = unbox<int>(reader.["id"])
Name = unbox<string>(reader.["name"])
}
x
//}
let y = GetPeople()
我打算用 yield 语句替换循环体并清理代码。但现在我只是试图通过调试代码并查看数据读取器来确保数据访问正常工作。目前我正在获得一个System.InvalidCastException
. 当我在上面注释行指示的点放置一个断点,然后在即时窗口中键入时,reader["name"]
我从数据库中获得了一个有效值,所以我知道它正在连接到数据库 ok。但是,如果我尝试将reader["name"]
(而不是reader.["name"]
)放入源文件中,我会收到“此值不是函数并且无法应用”消息。
为什么我可以reader["name"]
在即时窗口中使用,但不能在我的 fsharp 代码中使用?如何在阅读器中使用字符串索引?
更新
按照 Jack P. 的建议,我将代码拆分为单独的行,现在我看到了错误发生的位置:
let id = reader.["id"]
let id_unboxed = unbox id // <--- error on this line
id
具有object {long}
根据调试器的类型。