开发者

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)) ]

I have above code to read bytes[] from datareader.

getBytesData function takes reader and returns bytes[] from reader.

  • everything works fine but it getBytesData function is working very non-functional way.
  • i am creates zero filled byte array just to create array, is there any way of creating dynamic expanding or fixed lenght array

Is there any way i can optimize in F#?

Sorry for kind of开发者_运维知识库 question, but i have started a new project on F# to squeeze all juice out of it, so trying to get each line most optimal way


The GetBytes method of the IDataReader doesn't really provide any options for writing the code in a more functional way (it takes an array that it wants to modify, so we simply must give it some array...).

So your version of code is perfectly fine - even though it's not fully functional, you can at least keep the imperative part localized in that single function and keep the rest of your program functional (which is a good result)!

The only change I would do in your code is that I would move reader to the sequence comprehension (to make it more localized) and I would use the use keyword to make sure that it gets properly disposed (also, you don't need the List identifier in the sequence expression):

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


In my experience that is the best way to do this. Interacting with native .Net methods need to be used somewhat emparitiviley (thus the |> ignore), so encapsulating in a function then using the fn as part of your functional programming. I have asked questions related to using .Net methods in F# if you are interested.

Also make sure you dispose of the reader afterwards too.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜