F#使用DataReader

时间:2010-06-06 04:27:44

标签: f#

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 []。

  • 一切正常,但getBytesData函数工作非常无功能。
  • 我创建零填充字节数组只是为了创建数组,有没有办法创建动态扩展或固定长度数组

我有什么方法可以优化F#?

很抱歉有点问题,但是我已经在F#上开了一个新项目来挤出所有的汁液,所以试图让每一条线路都达到最佳状态

2 个答案:

答案 0 :(得分:8)

GetBytes的{​​{1}}方法并没有真正提供以更实用的方式编写代码的任何选项(它需要一个它想要修改的数组,所以我们必须给它一些数组...)。

所以你的代码版本非常好 - 即使它没有完全正常运行,你至少可以将命令部分保存在单个函数中,并保持程序的其余部分正常运行(这是一个很好的结果)!

我在代码中唯一的变化就是我会将IDataReader移到序列理解中(以使其更加本地化)并且我会使用reader关键字来确保它获得正确处理(也就是说,序列表达式中不需要use标识符):

List

答案 1 :(得分:0)

根据我的经验,这是最好的方法。与本机.Net方法的交互需要在某种程度上使用(因此|>忽略),因此封装在函数中然后使用fn作为函数式编程的一部分。如果您有兴趣,我已经在F#中提出了与使用.Net方法相关的问题。

另外请确保您之后丢弃了读卡器。