【发布时间】:2018-05-31 01:26:27
【问题描述】:
定义了以下类型。
type DownloadedItem = { Period: DateTime; Name: string } with
static member fromRdr(rdr:IDataReader) =
{ Period = rdr.GetDateTime 0; Name = rdr.GetString 1 }
static member asSeq (rdr:IDataReader) = seq {
while rdr.Read() do yield DownloadedItem.fromRdr rdr }
然后尝试从数据库表中获取数据。
let files =
let sql = "exec [sp_name] @StartPeriod"
use conn = new SqlConnection(Shared.connectionString)
use cmd = new SqlCommand(sql, conn)
cmd.Parameters.Add("@StartPeriod", SqlDbType.Date).Value <- StartPeriod
conn.Open()
use reader = cmd.ExecuteReader()
reader
|> DownloadedItem.asSeq
上面的表达式可以毫无问题地发送到F#交互窗口。
但是,评估files;; 得到以下错误?
val it : seq<DownloadedItem> =
Error: Invalid attempt to call Read when reader is closed.
【问题讨论】:
-
如果将
files设为函数会怎样?let files() = ...现在它是某个临时模块中的静态绑定,初始化可能会很棘手……而且您在其中有use绑定。