私は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コードでは使用できないのはなぜですか?リーダーで文字列インデックスを使用するにはどうすればよいですか?
アップデート
Jack P.のアドバイスに従って、コードを別々の行に分割すると、エラーが発生した場所がわかります。
let id = reader.["id"]
let id_unboxed = unbox id // <--- error on this line
id
object {long}
デバッガに応じたタイプです。