Как обрабатывать возможные значения Null, используя npgsql в f #? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующий код для получения списка ценных бумаг из таблицы безопасности

type Security =
    { symbol: string; exchangeId: int; name: string; firstDate: DateTime; lastDate: DateTime }

let getSecurities (conName: string) =
    // Using 'use' the 'Dispose' method is called automatically
    let conStr = 
        ConfigurationManager.ConnectionStrings.Item(conName).ConnectionString
    use conn = new NpgsqlConnection(conStr)

    // Handle exceptions that happen when opening the connection
    try conn.Open() 
    with ex -> raiseSql "Failed to connect to DB %s with Error %s " conName ex.Message

    // Using object initializer, we can nicely set the properties
    use cmd = new NpgsqlCommand()
    cmd.Connection <- conn
    cmd.CommandText <- "SELECT symbol, exchange_id, name, first_date, last_date FROM security;"

    use reader = 
        try cmd.ExecuteReader()
        with ex -> raiseSql "Failed to execute reader with error %s" ex.Message

    let results =
        [ while reader.Read() do
            yield {
                symbol = reader.GetString(reader.GetOrdinal("symbol"));
                exchangeId = reader.GetInt32(reader.GetOrdinal("exchange_id"));
                name = reader.GetString(reader.GetOrdinal("name"));
                firstDate = reader.GetDateTime(reader.GetOrdinal("first_date"));
                lastDate = reader.GetDateTime(reader.GetOrdinal("last_date"));
            } ]

    // Do more with the reader
    results

Поля first_date и last_date имеют возможные нулевые значения.Как мне их обработать, чтобы я мог решить, что делать, если они найдены нулевыми?

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

1 Ответ

0 голосов
/ 01 марта 2019

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

type Security =
    { symbol: string; 
        exchangeId: int; 
        name: string; 
        firstDate: DateTime option; 
        lastDate: DateTime option }

let handleNullDatesFromDb (reader: NpgsqlDataReader) (fieldName: string) =
    let ord = reader.GetOrdinal(fieldName)
    match reader.IsDBNull(ord) with
    | false -> Some (reader.GetDateTime(ord))
    | true -> None
...