Я новичок в 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"]
, я получаю действительное значение из базы данных, поэтому я знаю, что он подключается к базе данных в порядке. Однако, если я пытаюсь поместить reader["name"]
(в отличие от reader.["name"]
) в исходный файл, я получаю сообщение «Это значение не является функцией и не может быть применено».
Почему я могу использовать reader["name"]
в непосредственном окне, но не в моем коде fsharp? Как я могу использовать индексацию строк с читатель?
Обновить
Следуя совету Джека П., я разбил код на отдельные строки и теперь вижу, где возникает ошибка:
let id = reader.["id"]
let id_unboxed = unbox id // <--- error on this line
id
имеет тип object {long}
согласно отладчику.