F # работает с DataReader - PullRequest
       16

F # работает с DataReader

4 голосов
/ 06 июня 2010
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)) ]

У меня есть код выше для чтения байтов [] из хранилища данных.

Функция getBytesData принимает считыватель и возвращает байты [] из считывателя.

  • все работает нормально, но функция getBytesData работает очень не функционально.
  • я создаю заполненный нулем байтовый массив только для создания массива, есть ли способ создать динамически расширяемый массив или массив фиксированной длины

Можно ли как-нибудь оптимизировать F #?

Извините за такой вопрос, но я начал новый проект на F #, чтобы выжать из него весь сок, поэтому стараюсь получить каждую строку наиболее оптимальным способом

Ответы [ 2 ]

8 голосов
/ 07 июня 2010

Метод GetBytes IDataReader на самом деле не предоставляет никаких опций для написания кода более функциональным способом (он требует массив, который он хочет изменить, поэтому мы просто должны дать ему некоторый массив ..) .).

Таким образом, ваша версия кода в порядке - даже если она не полностью функциональна, вы можете, по крайней мере, сохранить императивную часть локализованной в этой единственной функции и сохранить функциональность остальной части вашей программы (что является хорошим результатом)!

Единственное изменение, которое я бы сделал в вашем коде, это то, что я переместил бы reader к пониманию последовательности (чтобы сделать его более локализованным), и я бы использовал ключевое слово use, чтобы убедиться, что оно правильно расположено (также вам не нужен идентификатор List в выражении последовательности):

let retVal =  
  [ use reader = selectCommand.ExecuteReader() 
    while reader.Read() do  
      yield (reader.GetString(0), getBytesData reader,  reader.GetDateTime(2)) ]
0 голосов
/ 06 июня 2010

По моему опыту, это лучший способ сделать это.Взаимодействие с нативными методами .Net должно использоваться в некоторой степени emparitiviley (таким образом, игнорируется |>), поэтому инкапсулирование в функции затем использование fn как часть вашего функционального программирования.Я задавал вопросы, связанные с использованием методов .Net в F #, если вам это интересно.

Также убедитесь, что впоследствии вы утилизируете читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...