[英]F# working with DataReader
let reader = selectCommand.ExecuteReader()
let getBytesData (x : IDataReader) =
let len = reader.GetBytes(1, int64 0, null, 0, 0);
// Create a buffer to hold the bytes, and then
// read the bytes from the DataTableReader.
let buffer : byte array = Array.zeroCreate (int32 len)
x.GetBytes(1, int64 0, buffer, 0, int32 len) |> ignore
buffer
let retVal =
List [ while reader.Read() do
yield (reader.GetString(0), getBytesData reader,
reader.GetDateTime(2)) ]
我有上面的代码从datareader读取bytes []。
getBytesData函数接受reader并从reader返回bytes []。
有什么方法可以优化F#吗?
抱歉有点问题,但我已经开始在F#上开设一个新项目来挤出所有的汁液,所以试着让每一条线都达到最佳状态
IDataReader
的GetBytes
方法并没有提供任何以更实用的方式编写代码的选项(它需要一个它想要修改的数组,所以我们只需要给它一些数组......)。
所以你的代码版本非常好 - 即使它没有完全正常运行,你至少可以将命令部分保存在单个函数中,并保持程序的其余部分正常运行(这是一个很好的结果)!
我将在你的代码中做的唯一改变是我会将reader
移动到序列理解(以使其更加本地化)并且我将使用use
关键字来确保它被正确处理(同样,你不需要序列表达式中的List
标识符):
let retVal =
[ use reader = selectCommand.ExecuteReader()
while reader.Read() do
yield (reader.GetString(0), getBytesData reader, reader.GetDateTime(2)) ]
根据我的经验,这是最好的方法。 与本机.Net方法的交互需要在某种程度上使用(因此|>忽略),因此封装在函数中然后使用fn作为函数式编程的一部分。 如果您有兴趣,我已经询问了有关在F#中使用.Net方法的问题。
另外请确保以后丢弃读卡器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.