У меня есть следующий код, который использует объекты Sequence для чтения данных из таблицы базы данных.
V1 работает правильно, но поскольку функция Seq.generate устарела, я получаю предупреждения компилятора.
Я пытался переместить этот код с V2 (ниже), но он работает неправильно -
в основном читатель открыт, но читается только первая запись - IOW - Read Next не
работать правильно.
Чтобы избежать ошибок / предупреждений компиляции, мне нужно преобразовать код V1 для использования выражения последовательности.
Любые идеи о правильном подходе здесь.
(Кстати - этот код основан на примерах из книги Роберта Пикеринга «Начало F #» -
(Доступ к данным / Раздел ADO.NET).
********************** V1 - Sequence Approach - Deprecated ************************
// execute a command using the Seq.generate
let execCommand (connName: string) (cmdString: string) =
Seq.generate
// This function gets called to open a connection and create a reader
(fun () -> openReader connName cmdString)
// This function gets called to read a single item in
// the enumerable for a reader/connection pair
(fun reader -> readRow(reader))
(fun reader -> reader.Dispose())
*********************** V2 Alternative - (Does not work) ***************************
let generateSequence connName cmdString =
seq { // This function gets called to open a connection and
//create a reader
use reader = openReader connName cmdString
// This function gets called to read a single item in
// the enumerable for a reader/connection pair
yield readRow(reader) }
// execute a command using the Seq.generate
let execCommand (connName: string) (cmdString: string) =
generateSequence connName cmdString
***************************** Common Functions **********************************
// Open a db connection
let openReader connName cmdString =
let conn = openSQLConnection(connName)
let cmd = conn.CreateCommand(CommandText=cmdString,
CommandType = CommandType.Text)
let reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
// read a row from the data reader
let readRow (reader: #DbDataReader) =
if reader.Read() then
let dict = new Dictionary<string, obj>()
for x in [ 0 .. (reader.FieldCount - 1) ] do
dict.Add(reader.GetName(x), reader.[x])
Some(dict)
else
None