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.
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)) ]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With