Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

F# working with DataReader

Tags:

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

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

like image 895
mamu Avatar asked Feb 26 '23 21:02

mamu


1 Answers

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)) ]
like image 197
Tomas Petricek Avatar answered Mar 06 '23 16:03

Tomas Petricek