F#使用DataReader

mam*_*amu 4 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)) ]
Run Code Online (Sandbox Code Playgroud)

我有上面的代码从datareader读取bytes [].

getBytesData函数接受reader并从reader返回bytes [].

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

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

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

Tom*_*cek 8

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

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

我在你的代码中唯一的改变是我会转向reader序列理解(使其更加本地化),我会使用use关键字来确保它被正确处理(同样,你不需要List标识符)序列表达式):

let retVal =  
  [ use reader = selectCommand.ExecuteReader() 
    while reader.Read() do  
      yield (reader.GetString(0), getBytesData reader,  reader.GetDateTime(2)) ]
Run Code Online (Sandbox Code Playgroud)