F# 转换序列。生成序列表达式

F# 转换序列。生成序列表达式,f#,database-connection,sequence,sqldatareader,F#,Database Connection,Sequence,Sqldatareader,下面的代码使用序列对象从数据库表读取数据。 V1工作正常,但由于Seq.generate函数已弃用,我收到编译器警告 我试图用V2(如下)重新放置此代码,但它无法正常工作- 基本上读卡器是打开的,但只有第一条记录是read-IOW-read-Next不打开 工作正常 为了避免编译错误/警告,我需要将V1代码转换为使用序列表达式 关于正确方法的任何想法 (顺便说一句-此代码基于Rob Pickering的开始F#书中的示例- (数据访问/ADO.NET部分) *******************

下面的代码使用序列对象从数据库表读取数据。 V1工作正常,但由于Seq.generate函数已弃用,我收到编译器警告

我试图用V2(如下)重新放置此代码,但它无法正常工作- 基本上读卡器是打开的,但只有第一条记录是read-IOW-read-Next不打开 工作正常

为了避免编译错误/警告,我需要将V1代码转换为使用序列表达式

关于正确方法的任何想法

(顺便说一句-此代码基于Rob Pickering的开始F#书中的示例- (数据访问/ADO.NET部分)

*********************V1-序列方法-已弃用************************
//使用Seq.generate命令执行命令
let execCommand(connName:string)(cmdString:string)=
顺序生成
//调用此函数以打开连接并创建读取器
(fun()->openReader connName cmdString)
//调用此函数以读取中的单个项
//读卡器/连接对的可枚举项
(趣味阅读器->阅读行(阅读器))
(趣味读取器->reader.Dispose())
***********************V2备选方案-(不起作用)***************************
让generateSequence connName cmdString=
seq{//调用此函数以打开连接并
//创建一个阅读器
使用reader=openReader connName cmdString
//调用此函数以读取中的单个项
//读卡器/连接对的可枚举项
生成readRow(读卡器)}
//使用Seq.generate命令执行命令
let execCommand(connName:string)(cmdString:string)=
generateSequence connName cmdString
*****************************共同功能**********************************
//打开数据库连接
让openReader connName cmdString=
让conn=openSQLConnection(connName)
让cmd=conn.CreateCommand(CommandText=cmdString,
CommandType=CommandType.Text)
让reader=cmd.ExecuteReader(CommandBehavior.CloseConnection)
//从数据读取器中读取一行
let readRow(读卡器:#DbDataReader)=
如果是reader.Read(),则
让dict=newdictionary()
对于[0..(reader.FieldCount-1)]中的x
dict.Add(reader.GetName(x),reader.[x])
一些(dict)
其他的
没有一个

您唯一遗漏的是:
而reader.Read()则执行

let generateSequence connName cmdString =
    seq { 
        use reader = openReader connName cmdString
        while reader.Read() do
            yield readRow reader 
    }

您需要移动一些控制结构以使其正常工作

let generateSequence connName cmdString =
    seq { 
        use reader = openReader connName cmdString
        while reader.Read () do
            yield readRow reader
        yield None
    }

let readRow (reader:#DbDataReader) =
    let dict = new Dictionary<string, obj>()
    for x in [0..(reader.FieldCount - 1)] do
        dict.Add (reader.GetName(x), reader.[x])
    Some dict
让generateSequence connName cmdString=
序号{
使用reader=openReader connName cmdString
reader.Read()执行以下操作
产生读行器
一无所获
}
let readRow(读卡器:#DbDataReader)=
让dict=newdictionary()
对于[0..(reader.FieldCount-1)]中的x
dict.Add(reader.GetName(x),reader.[x])
一些格言
let generateSequence connName cmdString =
    seq { 
        use reader = openReader connName cmdString
        while reader.Read () do
            yield readRow reader
        yield None
    }

let readRow (reader:#DbDataReader) =
    let dict = new Dictionary<string, obj>()
    for x in [0..(reader.FieldCount - 1)] do
        dict.Add (reader.GetName(x), reader.[x])
    Some dict